我想检索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应用程序接口,但它只给了我一个访问器:
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可以用来实现这一点呢?我可以玩倒影,但这不是正确的方式。谢谢。
发布于 2013-04-03 12:27:49
我会鼓励你“玩倒影”,因为这正是正确的方式。
启动,一般用于反射,或,用于类。您可能还会发现很有用。
这里给你一个提示:
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 class和Method class吧。
发布于 2013-04-03 12:36:22
首先:following JavaBean conventions is helpful.如果你有一个方法说是"retrieve“,但它是一个实际的getter方法,那么它比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()发布于 2013-04-03 12:50:44
反射只会查看方法的名称和签名,而不会查看它们实际做了什么。因此,您能否在此基础上可靠地识别get/set?
您可以识别所有字段: aaa、bbb等,然后查找其签名看起来像访问器、名称包含aaa或bbb等的所有方法。因此,您可能会找到getAaa()、setBbb()和fetchAaa(),甚至可能还有bbbFetcher(),但您不能确定这些方法是否真的是您正在寻找的。即使你要扫描源代码,也是很棘手的:
getMagnitude() { return squareRoot( x squared plus y squared) } 那是个吸入器吗?
底线:字段和方法名称的模式匹配将为您提供候选,但您必须设计适合您需求的匹配规则。
https://stackoverflow.com/questions/15778801
复制相似问题