【solvebug】Java反射報錯java.beans.IntrospectionException: Method not found,lombok的@Accessors注解


問題描述

Java反射報錯java.beans.IntrospectionException: Method not found:setXXXX

問題分析及解決

1、getter/setter方法命名不規范,就是setXxx, setxxx這樣的大小寫;

2、實體類方法返回值問題
使用PropertyDescriptor descriptor = new PropertyDescriptor(fieldName, classz)時,要求 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) 注解即可。或者在根據業務需求為需要反射的屬性添加相應的getter/setter方法。

Demo反編譯驗證

使用lombok.Data

/**
 * <p>@Author: healker</p>
 * <p>@datetime: 2020/8/26 11:36</p>
 * <p>@description: </p>
 */
@Data
public class EntityDemo {
    private String testField;
    private List<EntityDemo> entityDemoList;

}

編譯成class,再反編譯后

使用lombok.Data,並添加@Accessors(chain = true)注解

/**
 * <p>@Author: healker</p>
 * <p>@datetime: 2020/8/26 11:36</p>
 * <p>@description: </p>
 */
@Data
@Accessors(chain = true)
public class EntityDemo {
    private String testField;
    private List<EntityDemo> entityDemoList;

}

編譯成class,再反編譯后testField,entityDemoList的setter方法都是返回實體本身(用以鏈式調用)。

使用lombok.Data,並添加@Accessors(chain = true)注解,手寫testField字段的getter/setter方法

/**
 * <p>@Author: healker</p>
 * <p>@datetime: 2020/8/26 11:36</p>
 * <p>@description: </p>
 */
@Data
@Accessors(chain = true)
public class EntityDemo {
    private String testField;
    private List<EntityDemo> entityDemoList;

    public String getTestField() {
        return testField;
    }

    public void setTestField(String testField) {
        this.testField = testField;
    }
}

編譯成class,再反編譯后testField的setter方法返回void,entityDemoList的setter方法返回實體本身


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM