当前位置: 首页 > 知识库问答 >
问题:

方法引发了'java.lang.IllegalArgumentException'异常。如何使用java反射设置私有最终值

江德海
2023-03-14
 @Test
    void partitionProcessorTest() throws Exception {
     
        EventData eventData = new EventData(body);
        
        //  below line code for finding nested class
        Class<?> []clazz = eventData.getClass().getDeclaredClasses();

        // and this is my inner class object 
        Class<?> inner = clazz[0];

        // this is my inner class constructer 
        Constructor<?> constructor = inner.getDeclaredConstructor();
        constructor.setAccessible(true);
        Object obj = constructor.newInstance();

        // this is my sequenceNumber field. which is private final Long type, in inner class 
        Field f = inner.getDeclaredField("sequenceNumber");
        f.setAccessible(true);

        //I am trying to remove final keyword from declared field in my inner class
        Field filed= Field.class.getDeclaredField("modifiers");
        filed.setAccessible(true);
        filed.setInt(f, f.getModifiers() & ~Modifier.FINAL);
       
        // but iam getting exception, where i am donig mistake please suggest me  
        // In this line i am getting exception --> f.setLong(eventData , 10l);
        try{
        f.setLong(eventData , 10l);
        }
        catch(Throwable e)
        {
        e.printStackTrace();
        }
        System.out.println(obj);
    }

com.azure.messaging.eventhubs.models.eventcontext.updateCheckPoint(eventcontext.java:101)com.tdchannels.sdk.ms.channel.services.eventhubconsumerthread.lambda$new$0(eventhubconsumerthread.java:106)com.tdchannels.sdk.ms.channel.services.impl.eventhubconsumerthread.partitionprocessortest(eventhubconsumerserviceimplest.java:99)

共有1个答案

程胤运
2023-03-14

无法将java.lang.long字段com.azure.messaging.eventHubs.EventData$SystemProperties.SequenceNumber设置为(long)10

根据跟踪,您正在将long原语设置为long object,请尝试将对象设置为long而不是long

像这样

Long aLong = Long.valueOf(100);
try{
    f.setLong(eventData , aLong);
}
catch(Throwable e)
{
    e.printStackTrace();
}
 类似资料:
  • 问题内容: 基于使用Java反射更改私有静态最终字段,我尝试设置私有静态最终字段。 (我知道这非常骇人,但是这个问题与代码质量无关;与Java反射有关。) 此打印 我已经使用OpenJDK 6和7,以及Oracle 7进行了尝试。 我不知道Java反射可以提供什么保证。但是,如果失败了,我以为会有一个(实际上所有反射方法都会抛出异常)。 这是怎么回事 问题答案: Java内联字段可在编译时初始化为

  • 问题内容: 我想调用一个私有静态方法。我有名字 我听说可以使用Java反射机制来完成。我该怎么做? 编辑: 我在尝试调用该方法时遇到的一个问题是如何指定其参数的类型。我的方法收到一个参数,其类型为Map。因此,我不能这样做(在运行时,由于Java Type擦除,没有Map这样的东西)。是否有另一种方法来获得该方法? 问题答案: 假设您要调用MyClass.myMethod(int x);

  • 问题内容: 我有一堂课,但不幸的是,我需要在运行时更改它。 使用反射我得到这个错误: 有什么办法可以改变价值? 问题答案: 假设没有阻止你执行此操作,则可以使用来绕开并重置修饰符以摆脱,并实际上修改字段。 这是一个例子: 假设没有SecurityException抛出,上面的代码将打印出来”Everything is true”。 实际执行的操作如下: 基本boolean值true和falsein

  • 问题内容: 我有2类:和 通过反思,我想在课堂上设置: 但我有一个例外: 线程“主”中的异常java.lang.NoSuchFieldException:a_field 但是,如果我尝试: 有用。 使用setter方法我有同样的问题: 问题答案: 要访问私有字段,您需要设置为true。您可以离开超类领域。此代码有效:

  • 使用Java反射更改私有静态final字段 我按照上面链接中的说明使用java反射更改私有静态final字段。我有一个名为“数据”的对象在“data”内部,有一个名为“type”的私有静态最终变量我想将“type”设置为null。这是我的密码。 我试着在Java1.7上用类似的代码来做这件事,结果成功了。但是在Android上运行此代码会产生以下错误:java。lang.NoSuchFieldEx

  • 请注意,另一个项目是我从中使用的开源项目,仅用于分析,因此我不想使用它进行操作。 谁能帮帮我吗? 编辑: 这是我试图调用的方法: 错误似乎就在眼前: