2

关于一些我无法理解的小问题。我有以下内容:

public abstract class A 
{
  ...
}

和这个类的扩展

public class B extends A
{
 ...
}

现在我有一个如下所示的类

public class DoStuff extends AbstractDoStuff
{
  public void doNiceStuff(B b)
  {
    ...
  }
}

我试图通过反射调用这个类的方法。但是我试图从一个不知道 B 并且只知道 A 的包中调用这个方法。这是由于项目的依赖关系

所以我有以下代码需要找到方法doNiceStuff(B):

public abstract class AbstractDoStuff
{
  public static Method getGetterMethod(Class<? extends AbstractDoStuff> stuffClass) throws NoSuchMethodException
  {
    Method method = stuffClass.getDeclaredMethod("doNiceStuff", A.class)
    ...
  }
}

所以 getDeclaredMethod 应该在 DoStuff 类上找到 doNiceStuff 但似乎反射无法找到使用超类 A.class 的方法。但是我不能在那里提供 B.class 因为包对 B 的存在一无所知。

知道是否有办法解决这个问题吗?

问候

迈克尔

4

1 回答 1

2

您可以使用更多反射来获得它:

Method[] methods = stuffClass.getMethods(); 
for(Method m: methods) {
   if(m.getName().equals("doNiceStuff")) {
      Class<?> paramTypes = m.getParameterTypes();

      //condition on the desired parameter types comes here
      if(paramTypes.length==1 && A.class.isAssignableFrom(paramTypes[0]) {
        //we found it!
      }

   }
}

为什么 isSuperClass() 在这种情况下不好?

假设我们这样做:

if (paramTypes.length == 1 && paramTypes[0].getSuperclass().equals(A.class)) {
...

这个解决方案对班级有好处B,但如果我们有班级C怎么办?

public class C extends B {


    public void doNiceStuff(C arg0) {
        //do nice stuff here
    }

}

这个条件

paramTypes[0].getSuperclass().equals(A.class)

会是假的!paramTypes[0].getSuperClass() 是B.class, 不等于A.class...

类.getMethods()

返回一个包含 Method 对象的数组,该对象反映了由此 Class 对象表示的类或接口的所有公共成员方法,包括由类或接口声明的那些以及从超类和超接口继承的那些。

Class.isAssignableFrom()

确定此 Class 对象表示的类或接口是否与指定的 Class 参数表示的类或接口相同,或者是其超类或超接口。如果是,则返回 true;否则返回false。如果此 Class 对象表示原始类型,则如果指定的 Class 参数正是此 Class 对象,则此方法返回 true;否则返回false。具体来说,该方法测试指定的 Class 参数表示的类型是否可以通过恒等转换或扩展引用转换转换为该 Class 对象表示的类型。有关详细信息,请参阅 Java 语言规范,第 5.1.1 和 5.1.4 节。

推荐阅读:

于 2013-09-11T09:50:15.293 回答