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; }
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.
- quot reflection exception modifiers privatequot reflection exception modifiers 20230526 modifier reflect java improvements performance exceptions reflection content quot untracked modified quot installed private plasma quot exception rabbitmq reason outofmemoryerror quot exception thread bindingexception quot exception statement messagingexception quot exception connect version unsupportedclassversionerror quot exception