如何找到参考方法的第一个声明方法

时间:2010-05-10 17:31:47

标签: java generics reflection inheritance proxy

假设您有一个通用接口和一个实现:

public interface MyInterface<T> {

  void foo(T param);
}

public class MyImplementation<T> implements MyInterface<T> {

  void foo(T param) {

  }
}

这两种类型是我提供的框架类型。在下一步中,我希望允许用户扩展该界面以及重新声明foo(T param),以便为其配备进一步的注释。

public interface MyExtendedInterface extends MyInterface<Bar> {

  @Override
  void foo(Bar param);

  // Further declared methods
}

我为扩展接口创建了一个AOP代理,并拦截了对进一步声明的方法的调用。由于foo(…)现在已在MyExtendedInterface中重新声明,因为MethodInvocation.proceed()的实例只实现了MyImplementation而不是MyInterface.foo(…),我只能通过调用MyExtendedInterface.foo(…)来执行它

那么有没有办法访问最初声明方法的方法?关于这个例子,有没有办法找出foo(Bar param)最初在MyInterface中声明并获得对Method实例的访问权?

我已经尝试扫描基类方法,以便按名称和参数类型进行匹配,但这样做并不会因为普通弹出而导致MyImplementation.getMethod("foo", Bar.class)显然会抛出NoSuchMethodException。我已经知道MyExtendedInterface类型MyInterfaceBar。所以,如果我可以在MyImplementation上创建某种“类型化视图”,我的数学算法可以实际解决。

其他信息:

我为MyExtendedInterface创建代理,如下所示:

ProxyFactory factory = new ProxyFactory();
factory.setTarget(new MyImplementation());
factory.setInterfaces(new Class[] { MyExtendedInterface.class });
factory.addInterceptor(new MyInterceptor(MyExtendedInterface.class));

拦截器几乎扫描方法并对MyExtendedInterface中声明的所有方法执行JPA查询,但将MyInterface中声明的方法的所有方法调用路由到代理目标。只要MyInterface中的方法不被重新声明为目标,然后再不再实现它,这就可以工作。

public class MyInterceptor implements MethodInterceptor {

  public Object invoke(final MethodInvocation invocation)
            throws Throwable {

    // handling of query methods
    // else

    invocation.proceed();
    // ^^ works if not redeclared but not if
  }
}

所以我想做的不是调用.proceed()就是检测最初声明被调用者的方法并手动调用目标。

2 个答案:

答案 0 :(得分:1)

好的,这是我提出的解决方案:我知道基类和泛型结构(在这种情况下T意味着什么)以及MyExtendedInterface类型MyInterface到{{1}我可以扫描基本实现以寻找可能的匹配,如下所示(伪代码):

Bar

在这种情况下,我不需要通用的解决方案,因此似乎可行。

答案 1 :(得分:0)

整个场景似乎很奇怪。您无法将MyExtendedInterface上声明的AOP应用于MyImplementation,因为它没有实现它。

其次,我不明白为什么哪个接口定义了一个方法很重要,因为它是调用该方法的实现。

除此之外,您可以通过getDeclaredMethods()获取某个类/接口声明的所有方法。然后你可以迭代它们并找到符合你的标准(名称)的东西