美文网首页
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

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