我是靠谱客的博主 怡然镜子,最近开发中收集的这篇文章主要介绍解决: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: Can not set java.lang.Boolean field所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部