无法通过使用反射的子类实例查看抽象基类方法



如下所示,我有一个抽象基类和一个扩展基类的子类。现在,当我通过下面的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()修复问题

.

相关内容

  • 没有找到相关文章

最新更新