我有一个如下所示的抽象基类和一个扩展基类的子类。现在,当我通过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);
}
}
}
答案 0 :(得分:-1)
通常只查看您调查的类的方法,因为Class-Object只包含类本身的信息而不包含其父类的信息。如果要查看超类的字段和方法,则必须获取超类。
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 :(得分:-1)
我发现了问题。问题在于理解这两种方法之间的区别,并根据您的需要使用它
1.Class.getDeclaredMethods()返回您尝试通过类对象引用的类的方法 2. Class.getMethods()返回您尝试引用的类的继承方法+方法。简而言之,它将返回其父类的所有方法或它正在实现的任何接口。由于getMethods采用客户端的类视图,该数组将包含所有公共方法,包括类本身中定义的方法并且在它的超级类和超级duper类中依此类推到Object
所以在我的情况下使用getMethods()修复了问题