如下所示,我有一个抽象基类和一个扩展基类的子类。现在,当我通过下面的spring获得子类的实例时,我无法看到基类方法,尽管我所有的基类方法都是公共的。我试图获得通过spring检索的对象(bean)的所有方法我没有看到在抽象基类中定义的方法。有人能告诉我这段代码有什么问题吗?
我只能看到那些在子类中显式定义的方法。
//Base abstract class
public abstract class A<K, V> implements C<K, V>,CD<K,V> {
public final V get(final K key){}
public final V get(String key){}
public String getValue();
}
//Child concrete class
public class Q extends A<Long, XYZ> implements QC,
CD<Long, XYZ> {
public Class<XYZ> getClass() {}
public String getValue(){}
}
//Code to retrieve the objects using reflection
final Object someObject = ApplicationContext.getBean("Q");
for (Method method : someObject.getClass().getDeclaredMethods()) {
if (Modifier.isPublic(method.getModifiers()) && method.getParameterTypes().length == 0
&& method.getReturnType() != void.class
&& (method.getName().startsWith("get") || method.getName().startsWith("is"))) {
Object value = method.invoke(someObject);
if (value != null) {
System.out.println(method.getName() + "=" + value);
}
}
}
通常只看到您所研究的类的方法,因为class - object只包含类本身的信息,而不包含其父类的信息。如果你想看到父类的Fields和Methods,你必须获得父类。
Class currentClass = someObject.getClass();
while (currentClass != null) {
for (Method method : currentClass.getDeclaredMethods()) {
...
}
currentClass = currentClass.getSuperclass();
//http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getSuperclass()
}
我发现了问题所在。问题在于理解这两种方法之间的区别,并根据自己的需要使用它
1.Class.getDeclaredMethods()返回你试图通过类对象引用的类的方法2. getmethods()返回继承的方法+您试图引用的类的方法。简而言之,它将返回其父类或它正在实现的任何接口的所有方法。由于getMethods采用类的客户端视图,因此数组将包含所有公共方法,包括在类本身及其超类和超类中定义的方法,等等,直到Object
所以在我的情况下使用getMethods()修复问题
.