我有一个班级:
public abstract class Produkt extends ObjectPlus implements Serializable {
static int ID = 0;
private int id;
public Produkt() {
super();
id = ID++;
}
public int getId() {
return id;
}
//lot OF OTHER METHODS
}
在其他类的其他地方,我尝试在对象上调用getId()
方法,以获取id
字段值:
Integer fieldValue = (Integer) new PropertyDescriptor("Id", c).getReadMethod().invoke(o);
c
的类型为Class
,o
的类型为Object
,id
是我想要的字段。
但我得到了这个例外:
java.beans.IntrospectionException: Method not found: setId
at java.beans.PropertyDescriptor.<init>(Unknown Source)
at java.beans.PropertyDescriptor.<init>(Unknown Source)
at pakiet.ObjectPlus.getCurrentId(ObjectPlus.java:143)
at pakiet.ObjectPlus.wczytajEkstensje(ObjectPlus.java:118)
at pakiet.Main.main(Main.java:72)
完整的方法是:
public static int getCurrentId(Class c){
//jak wczytamy to zeby nowe osoby mialy nadal unikalne ID(wieksze od najwiekszego)
int maxId = Integer.MIN_VALUE;
for (Map.Entry<Class, ArrayList> entry : ekstensje.entrySet()) {
for (Object o : entry.getValue()){
// This method is the dynamic equivalent of the Java language instanceof operator.
if(c.isInstance(o)){
try{
Class<?> clazz = o.getClass();
Integer fieldValue = (Integer) new PropertyDescriptor("Id", c).getReadMethod().invoke(o);
if(fieldValue > maxId)
maxId = fieldValue;
}catch(Exception e){
e.printStackTrace();
}
}
}
}
return maxId + 1;
//
}
答案 0 :(得分:1)
在我看来,你的PropertyDescriptor构造函数接受你的字符串&#34; Id&#34;并试图找到一个setId()
因为它而使用,并且没有这样的方法可以调用它。
编辑:确实发生了什么:查看PropertyDescriptor
的源代码答案 1 :(得分:0)
您可以为此使用其他构造函数,尽管它不是那么干净(但是您可以将其包装到辅助函数中):
Method getter = new PropertyDescriptor(property, objectClass, "is" + Character.toUpperCase(property.charAt(0)) + property.substring(1), null).getReadMethod();
尽管我传递了“ is”前缀,但它也适用于以“ get”开头的getter属性。如果没有“ is”方法,则getReadMethod将搜索一个名为“ get”的方法。