问题场景
使用反射为Boolean类型变量赋值时,调用 java.lang.reflect.Field#setBoolean
报错
public class SetBooleanDemo {
public static void main(String[] args) throws IllegalAccessException {
BooleanObj obj = new BooleanObj();
Class<? extends BooleanObj> booleanClass = obj.getClass();
for (Field declaredField : booleanClass.getDeclaredFields()) {
declaredField.setAccessible(true);
declaredField.setBoolean(obj,Boolean.TRUE);
}
System.out.println(obj);
}
@Data
public static class BooleanObj{
private boolean bool1;
private Boolean bool2;
}
}
Exception in thread "main" java.lang.IllegalArgumentException: Can not set java.lang.Boolean field com.example.demo.reflect.SetBooleanDemo$BooleanObj.bool2 to (boolean)true
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:175)
at sun.reflect.UnsafeObjectFieldAccessorImpl.setBoolean(UnsafeObjectFieldAccessorImpl.java:90)
at java.lang.reflect.Field.setBoolean(Field.java:801)
at com.example.demo.reflect.SetBooleanDemo.main(SetBooleanDemo.java:20)
无论切换成 declaredField.setBoolean(obj,Boolean.TRUE)
还是 declaredField.setBoolean(obj,Boolean.TRUE.booleanValue())
都未能解决
本来是个小问题,但是搜了下博客都是答非所问
解决方式
使用 java.lang.reflect.Field#set
即可
public class SetBooleanDemo {
public static void main(String[] args) throws IllegalAccessException {
BooleanObj obj = new BooleanObj();
Class<? extends BooleanObj> booleanClass = obj.getClass();
for (Field declaredField : booleanClass.getDeclaredFields()) {
declaredField.setAccessible(true);
declaredField.set(obj,Boolean.TRUE);
}
System.out.println(obj);
}
@Data
public static class BooleanObj{
private boolean bool1;
private Boolean bool2;
}
}
延伸类比包装类型字短适用 setXXX方法都可能出现此问题,直接使用set 方法即可
END