Java反射报错java.beans.IntrospectionException: Method not found

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

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的类就可以解决了,或者新建一个查询方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容