美文网首页
Java反射报错java.beans.Introspection

Java反射报错java.beans.Introspection

作者: 沁园Yann | 来源:发表于2020-12-30 11:57 被阅读0次

一、有可能是下面三种原因:

1、getter/setter方法命名不规范,就是getUser, getuser 这样的大小写;

2、实体类方法返回值问题
new PropertyDescriptor(propertyName, clazz); 要求 setter 返回值为 void,getter 返回值为属性类型,如下的getter方法返回的类型就不对,会报Method not found错误

    private Date startDate;

    public void setStartDate(Date startDate) {
        this.startDate = startDate;
    }

    //将方法返回类型改成Date就解决了
    public String getStartDate() {
        return DateUtil.formatDate(startDate);
    }

3、实体类使用了lombok 中的 @Accessors(chain = true) 注解
该注解使得对象的 setter 方法返回对象本身,以便链式使用
new PropertyDescriptor(propertyName, clazz); 要求 setter 返回值为 void
解决:去掉 @Accessors(chain = true) 注解即可。

二、#####使用Java反射时,还遇到了下面这个错误
java.lang.IllegalArgumentException: object is not an instance of declaring class
我是使用Java反射机制对比两个对象的属性变化的,代码如下

/**
     * 获取两个对象之间的变化(仅对比当前对象写的属性,不会对比父类写的属性)
     * @param oldBean
     * @param newBean
     * @return
     */
    public String getObjectDifferent(Object oldBean, Object newBean) {
        if (oldBean != null && newBean!= null) {
            String modifyValue = "";
            try {
                Class clazz = oldBean.getClass();
                List<Field> fields = new ArrayList<>();
                fields.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
                //如果父类属性变化也记录
                fields.addAll(new ArrayList<>(Arrays.asList(clazz.getSuperclass().getDeclaredFields())));
                for (Field field : fields) {
                    if ("serialVersionUID".equals(field.getName())) {
                        continue;
                    }
                    PropertyDescriptor pd = new PropertyDescriptor(field.getName(), oldBean.getClass());
                    Method getMethod = pd.getReadMethod();
                    Object o1 = getMethod.invoke(oldBean);
                    Object o2 = getMethod.invoke(newBean); // 这里报错了
                    if (o1 == null || o2 == null) {
                        continue;
                    }
                    if (!o1.toString().equals(o2.toString())) {
                        modifyValue += field.getName() + ":" + o1 + "->" + o2 + "; ";
                    }
                }
                return modifyValue;
            } catch (Exception e) {
                e.printStackTrace();
                return e.toString();
            }
        } else {
            log.info("传入对象为空,保存 “修改操作” 系统敏感操作记录失败");
            return "保存 “修改操作” 传入对象为空";
        }
    }

传入的参数oldBean是从数据库查询得到的对象,newBean是前端传入的对象,两个对象是同一个类的,却报“java.lang.IllegalArgumentException: object is not an instance of declaring class”异常,查看Mapper.xml文件,发现返回类型resultType配置的是实体类的子类,将返回类型改成和oldBean的类就可以解决了,或者新建一个查询方法。

相关文章

  • Java反射报错java.beans.Introspection

    一、有可能是下面三种原因: 1、getter/setter方法命名不规范,就是getUser, getuser 这...

  • Android Kotlin 反射使用 (null receiv

    最近在使用Kotlin反射遇到些问题,总结一下:报错:java.lang.NullPointerException...

  • 博客地址

    java注解-01、java注解-02、Git面试资源java反射-01、java反射-02、java反射-03为...

  • Java反射机制入门

    Java反射机制入门 一、什么是反射 JAVA反射机制(The JAVA reflection mechanism...

  • Java基础之反射

    Java基础之—反射(非常重要)Java中反射机制详解Java进阶之reflection(反射机制)——反射概念与...

  • 反射之一

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • 反射之二

    总结内容源自一下文章粗浅看java反射机制反射机制应用实践谈谈java反射机制Java Reflection(反射...

  • Java基础之反射

    Java基础之反射 反射基本介绍 反射的使用通过反射调用属性和方法通过反射获取配置文件 反射基本介绍 Java反射...

  • 反射 getDeclaredField  报错java.lang

    jdk环境:1.8 开发工具:idea 运行一下代码 如下: 报错java.lang.NoSuchFieldExc...

  • Java 反射机制

    Java 反射机制 什么是反射 Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”。 ...

网友评论

      本文标题:Java反射报错java.beans.Introspection

      本文链接:https://www.haomeiwen.com/subject/ipxhoktx.html