【问题标题】:Java - Reflection setting value at runtimeJava - 运行时的反射设置值
【发布时间】:2013-04-23 02:38:06
【问题描述】:

我尝试为 java bean 中可用的字段设置值,如下所示,我想省略静态最终字段:

public Class creatObjectWithDefaultValue(String className) throws IllegalArgumentException, IllegalAccessException {
        DefaultParamValues defaultParamValues = null;
        Class objectClass = null;
        try {
            objectClass = Class.forName(className);
             Field[] fields = objectClass.getDeclaredFields();

             for(Field f:fields){
                 f.setAccessible(true);
                    //if(!f.isAccessible()){
                       // f.setAccessible(true);
                        Class<?> type = f.getType();


                        if(! Modifier.isFinal(f.getModifiers()) && type.equals(Integer.class)){
                            f.set(objectClass, defaultParamValues.INTEGER);  
                        } else if(! Modifier.isFinal(f.getModifiers()) && type.equals(BigInteger.class)){
                            f.set(objectClass, defaultParamValues.BIGINTEGER);  
                        }/*else if(! Modifier.isFinal(f.getModifiers()) && type.equals(LocalDate.class)){
                            f.set(objectClass, defaultParamValues.DATE);  
                        }*/else if(! Modifier.isFinal(f.getModifiers()) && type.equals(Boolean.class)){
                            f.set(objectClass, defaultParamValues.BOOLEAN);  
                        }else if(! Modifier.isFinal(f.getModifiers()) && type.equals(Long.class)){
                            f.set(objectClass, defaultParamValues.LONGVALUE);  
                        }
                        f.setAccessible(false);
                    //}
                        //To print the value set
                        if(! Modifier.isFinal(f.getModifiers()) ){
                             System.out.println(f.get(objectClass));
                        }

                }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return objectClass;
    }

运行程序时出现以下异常:完整的堆栈跟踪是:

Exception in thread "main" java.lang.IllegalAccessException: Class com.hexgen.tools.JsonConverter can not access a member of class com.hexgen.ro.request.CreateRequisitionRO with modifiers "private"
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
    at java.lang.reflect.Field.doSecurityCheck(Field.java:960)
    at java.lang.reflect.Field.getFieldAccessor(Field.java:896)
    at java.lang.reflect.Field.get(Field.java:358)
    at com.hexgen.tools.JsonConverter.creatObjectWithDefaultValue(JsonConverter.java:89)
    at com.hexgen.tools.JsonConverter.main(JsonConverter.java:181)

有什么问题?有人可以帮我解决这个问题吗?

最好的问候。

【问题讨论】:

  • JsonConverter.java:89
  • f.setAccessible(false);

标签: java reflection access-modifiers


【解决方案1】:

您将字段的accessible 属性恢复为false,然后继续访问其值。

不要将accessible设置回false。

【讨论】:

  • 谢谢马尔科,我还是明白了Exception in thread "main" java.lang.IllegalAccessException: Class com.hexgen.tools.JsonConverter can not access a member of class com.hexgen.ro.request.CreateRequisitionRO with modifiers "private"
  • 我认为这不是问题所在。检查我的答案。
  • 听听亚当的建议,他做对了。您没有创建该类的实例,因此您当前的代码仅适用于 static 字段。
  • @AdamArold 这不是问题是不正确的:它不是唯一的问题。
  • 我明白了,你是对的。我们在这里面临着多个问题。但是,嘿,这是反射......
【解决方案2】:

我认为问题在于您试图在一个类而不是该类的实例上设置字段。

首先,您应该创建一个 objectClass 的实例并设置该实例的值!

这里:

f.set(objectClass, defaultParamValues.INTEGER);

您传递的是类对象,而不是该类的实例。 当您的程序遇到不是static 的字段时会出现问题,因此您的Exception

如果您想过滤 static 字段,您可以使用:

java.lang.reflect.Modifier.isStatic(field.getModifiers())

【讨论】:

  • 我创建了如下的新实例,但我仍然得到相同的objectClass.newInstance();
  • 你能更新你的代码吗?用一些东西表明你在哪一行得到了异常。
  • ` if(!Modifier.isFinal(f.getModifiers())){ System.out.println(f.get(objectClass)); }` 是我得到异常的地方
  • 和之前一样的异常?
  • 你能启动你的调试器并弄清楚它在哪个方法调用上抛出了异常?
猜你喜欢
  • 1970-01-01
  • 2013-12-03
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多