java reflection exception--can not access a member of class XXX with modifiers "private"

look at the sample program below. It works when I run it.

Field[] fields = reflectAllFields(parameter);
for (Field field : fields) {
    if ("createTime".equals(field.getName())) {
        field.setAccessible(true);
        Object localCreateDate = field.get(parameter);
        if (localCreateDate == null || "".equals(localCreateDate)) {
            if (field.getType() == Date.class) {
                field.set(parameter, DateUtils.getPlusDaysDate( new Date(),10));
            } else if (field.getType() == LocalDateTime.class) {
                field.set(parameter, LocalDateTime.now());
            }
        }
    }
}

 

By the way, the utility method  reflectAllFields  is defined in the same class.

// import java.lang.reflect.Field;

private static Field[] reflectAllFields(Object object) {
    Class<?> clazz = object.getClass();
    List<Field> fieldList = new ArrayList<>();
    while (clazz != null) {
        fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
        clazz = clazz.getSuperclass();
    }
    Field[] fields = new Field[fieldList.size()];
    fieldList.toArray(fields);
    return fields;
}
View Code

 

Then, I made a little adjustment, see below. The program throwed an exception → can not access a member of class com.emaxcard.account.entity.Account with modifiers "private"

Field[] fields = reflectAllFields(parameter);
for (Field field : fields) {
    if ("createTime".equals(field.getName())) {
        Object localCreateDate = field.get(parameter);
        if (localCreateDate == null || "".equals(localCreateDate)) {
            field.setAccessible(true);
            if (field.getType() == Date.class) {
                field.set(parameter, DateUtils.getPlusDaysDate( new Date(),10));
            } else if (field.getType() == LocalDateTime.class) {
                field.set(parameter, LocalDateTime.now());
            }
        }
    }
}

 

Here are the stacktraces :

java.lang.IllegalAccessException: Class com.emaxcard.account.config.MybatisInterceptor can not access a member of class com.emaxcard.account.entity.Account with modifiers "private"
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
    at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
    at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
    at java.lang.reflect.Field.get(Field.java:390)
    at com.emaxcard.account.config.MybatisInterceptor.intercept(MybatisInterceptor.java:89)
    at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
    at com.sun.proxy.$Proxy157.update(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
    ... 50 more

 

 

I note that The mentioned field com.emaxcard.account.entity.Account#createTime is private. When I change it to public, the above IllegalAccessException disappears. Of course, we should define fields as private, that's the POJO specification.

 

In a word, If you try to visit the value of an object's private field using reflection, such as Field#get or Field#set, you should call Field#setAccessible ahead.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章