我想检索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可用于实现此目的?我可以玩反射,但这不是正确的方法。感谢。
答案 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
}
答案 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) }
是吸气鬼吗?
底线:字段名称和方法的模式匹配将为您提供候选人,但您必须设计符合您需求的匹配规则。