如何获取类中属性的所有访问器方法?

时间:2013-04-03 04:20:38

标签: java

我想检索Java类中给定属性的所有访问器。我尝试了一些东西,但它没有给出我期待的输出。例如:

public class demo {
    private String abc;

    public String getAbc() {
        return abc;
    }

    public void setAbc(String abc) {
        this.abc = abc;
    }

    public String fetchAbc() {
        return abc;
    }
}

这里,abc属性有两个getter,我想找到我的项目中出现的情况。我尝试了下面的代码,它使用了BeanInfo API,但它只给了我一个访问器:

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;

public class BeanDemo {

    public void myMethod() throws IntrospectionException {
        BeanInfo beanInfo = Introspector.getBeanInfo(demo.class);

        for (PropertyDescriptor property : beanInfo.getPropertyDescriptors()) {
            //all attributes of class.
            property.getReadMethod(); // getter
            property.getWriteMethod(); // setter
        }
    }
}

有人能说出是否有其他API可用于实现此目的?我可以玩反射,但这不是正确的方法。感谢。

3 个答案:

答案 0 :(得分:0)

我鼓励你“玩反思”,因为这是正确的方法。

开始here,一般用于反射,或here用于类。您可能还会发现this reference page有用。

这是一个提示:

Method[] methods = demo.class.getMethods();
for (int i=0; i<methods.length; i++) {
    Method method = methods[i];
    // Take a look at the Method documentation to find out more:
    // http://docs.oracle.com/javase/7/docs/api/java/lang/reflect/Method.html

    // Or, look at the Method tutorial here:
    // http://docs.oracle.com/javase/tutorial/reflect/member/method.html
}

至少查看Class<T> classMethod class

答案 1 :(得分:0)

首先:following JavaBean conventions is helpful.如果你有一个方法说“检索”但它是一个真正的吸气剂,它对你自己比对Java更困惑 - 为什么不止一种方法来获得一个字段?

第二:反射是你的朋友。你可以反思性地提取有关物体的信息而不会有太大的痛苦,并检索你想要的结果。您应该查看the Reflection Trail,因为它包含大量有用的信息,可以帮助您入门。

这是一个小样本 - 它将获得此类中标记为“get”的所有方法。

public class StackOverflow {
    public static void main(String[] args) throws ClassNotFoundException {
        Method[] methods = Class.forName("Fake").getMethods();
        for(Method m : methods) {
            if(!m.getDeclaringClass().equals(Object.class) && m.toGenericString().contains("get")) {
                System.out.println(m.toGenericString());
            }
        }
    }
}

class Fake {
    private String objField;
    private int primitiveField;
    private boolean[] arrayField;

    public void setObjField(final String theObjField) {
        objField = theObjField;
    }

    public void setPrimitiveField(final int thePrimitiveField) {
        primitiveField = thePrimitiveField;
    }

    public void setArrayField(final boolean[] theArrayField) {
        arrayField = theArrayField;
    }

    public String getObjField() {
        return objField;
    }

    public int getPrimitiveField() {
        return primitiveField;
    }

    public boolean[] getArrayField() {
        return arrayField;
    }
}

以上输出:

public java.lang.String Fake.getObjField()
public int Fake.getPrimitiveField()
public boolean[] Fake.getArrayField()

答案 2 :(得分:0)

反射只会查看方法的名称和签名,而不会查看它们实际执行的操作。那么你能否在此基础上可靠地确定一个获取/设置?

您可以识别所有字段:aaa,bbb等,然后查找签名看起来像访问者且名称包含aaa或bbb等的所有方法。因此,您可以找到getAaa(),setBbb()和fetchAaa() ,甚至可能是bbbFetcher(),但你不能确定这些中的任何一个都是你正在寻找的。即使您要扫描来源也很棘手:考虑

getMagnitude() { return squareRoot( x squared plus y squared) } 

是吸气鬼吗?

底线:字段名称和方法的模式匹配将为您提供候选人,但您必须设计符合您需求的匹配规则。