Java通过反射找到setter和getter

chi*_*tiz 1 java reflection getter setter

我有这样的课

public class Student
{

    private String reference;
    private String aPlaceAt;
    //methods generate by Netbeans Eclipse generates the same methods
    public String getaPlaceAt(){return aPlaceAt;}
    public void setaPlaceAt(String aPlaceAt){this.aPlaceAt = aPlaceAt;}    
    public String getReference(){return reference;}
    public void setReference(String reference){this.reference = reference;}       
}
Run Code Online (Sandbox Code Playgroud)

后来我需要找到每个属性的setter和getter,reflection我使用下面的代码

public Method findSetterFor(final Class clazz,final String propertyName) throws Exception
{
    return new PropertyDescriptor(propertyName,clazz).getWriteMethod();
}

for(final Field field:clazz.testClazz.getDeclaredFields())
System.out.println(field.getName()+" "+clazz.findSetterFor(clazz.testClazz,field.getName()));        
Run Code Online (Sandbox Code Playgroud)

他们返回正确的setter以供参考,但是对于属性aPlaceAt

Exception in thread "main" java.beans.IntrospectionException: Method not found: isAPlaceAt
Run Code Online (Sandbox Code Playgroud)

为什么是啊?不应该

public void setaPlaceAt(String aPlaceAt){this.aPlaceAt = aPlaceAt;}?
Run Code Online (Sandbox Code Playgroud)

或者为什么我做错了?怎么能完成它谢谢?

我认为根据SO和此链接的其他帖子正确生成了setter和getter

链接

方法是由...生成的 Netbeans and Eclipse and intellij

更新 这里是另一个关于它的热门论坛同样的问题请检查出来

另一个SO帖子

Sot*_*lis 5

您的getter/setter名称不遵循Java bean命名约定(或者可能是do).对于PropertyDescriptor,根据javadoc

请注意,属性名称应以小写字符开头,该字符将在方法名称中大写.

他们应该是

public String getAPlaceAt() {
    return aPlaceAt;
}

public void setAPlaceAt(String aPlaceAt) {
    this.aPlaceAt = aPlaceAt;
}
Run Code Online (Sandbox Code Playgroud)

错误消息有点误导.内省探测器会尝试找到getAPlaceAt然后isAPlaceAt.它将报告它尝试的最后一件事但失败了.

您可以通过IDE生成setter/getter来避免此类错误.