問題描述
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方法返回實體本身