我是靠谱客的博主 怡然镜子,这篇文章主要介绍解决:java.lang.IllegalArgumentException: Can not set java.lang.Boolean field,现在分享给大家,希望可以做个参考。
问题场景
使用反射为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
最后
以上就是怡然镜子最近收集整理的关于解决:java.lang.IllegalArgumentException: Can not set java.lang.Boolean field的全部内容,更多相关解决:java.lang.IllegalArgumentException:内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复