Java - 运行时反射设置值

标签 java reflection access-modifiers

我尝试为 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)

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

最诚挚的问候。

最佳答案

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

不必费心将可访问性设置回 false。

关于Java - 运行时反射设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16278486/

相关文章:

java - Proguard:找不到引用的类

java - 将具有类型参数的类作为Java中泛型方法的类型参数传递

reflection - 在运行时使用 JDK 编译器时的内存泄漏

Java 8 方法引用 - 仅取消引用一次?

Java类的组织

java - JavaFx 和 @FXML 中的访问修饰符

java - 缓冲区从文件读取音频数据给出零

java - 单例类的优势是什么?

java - 运行时局部变量的泛型类型

java - 公开成员以对其进行单元测试