Java反射報(bào)錯(cuò)java.beans.IntrospectionException: Method not found

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

1、getter/setter方法命名不規(guī)范,就是getUser, getuser 這樣的大小寫(xiě);

2、實(shí)體類方法返回值問(wèn)題
new PropertyDescriptor(propertyName, clazz); 要求 setter 返回值為 void,getter 返回值為屬性類型,如下的getter方法返回的類型就不對(duì),會(huì)報(bào)Method not found錯(cuò)誤

    private Date startDate;

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

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

3、實(shí)體類使用了lombok 中的 @Accessors(chain = true) 注解
該注解使得對(duì)象的 setter 方法返回對(duì)象本身,以便鏈?zhǔn)绞褂?br> new PropertyDescriptor(propertyName, clazz); 要求 setter 返回值為 void
解決:去掉 @Accessors(chain = true) 注解即可。

二、#####使用Java反射時(shí),還遇到了下面這個(gè)錯(cuò)誤
java.lang.IllegalArgumentException: object is not an instance of declaring class
我是使用Java反射機(jī)制對(duì)比兩個(gè)對(duì)象的屬性變化的,代碼如下

/**
     * 獲取兩個(gè)對(duì)象之間的變化(僅對(duì)比當(dāng)前對(duì)象寫(xiě)的屬性,不會(huì)對(duì)比父類寫(xiě)的屬性)
     * @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); // 這里報(bào)錯(cuò)了
                    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("傳入對(duì)象為空,保存 “修改操作” 系統(tǒng)敏感操作記錄失敗");
            return "保存 “修改操作” 傳入對(duì)象為空";
        }
    }

傳入的參數(shù)oldBean是從數(shù)據(jù)庫(kù)查詢得到的對(duì)象,newBean是前端傳入的對(duì)象,兩個(gè)對(duì)象是同一個(gè)類的,卻報(bào)“java.lang.IllegalArgumentException: object is not an instance of declaring class”異常,查看Mapper.xml文件,發(fā)現(xiàn)返回類型resultType配置的是實(shí)體類的子類,將返回類型改成和oldBean的類就可以解決了,或者新建一個(gè)查詢方法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容