假设您有一个通用接口和一个实现:
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
类型MyInterface
到Bar
。所以,如果我可以在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()就是检测最初声明被调用者的方法并手动调用目标。
答案 0 :(得分:1)
好的,这是我提出的解决方案:我知道基类和泛型结构(在这种情况下T意味着什么)以及MyExtendedInterface
类型MyInterface
到{{1}我可以扫描基本实现以寻找可能的匹配,如下所示(伪代码):
Bar
在这种情况下,我不需要通用的解决方案,因此似乎可行。
答案 1 :(得分:0)
整个场景似乎很奇怪。您无法将MyExtendedInterface
上声明的AOP应用于MyImplementation
,因为它没有实现它。
其次,我不明白为什么哪个接口定义了一个方法很重要,因为它是调用该方法的实现。
除此之外,您可以通过getDeclaredMethods()
获取某个类/接口声明的所有方法。然后你可以迭代它们并找到符合你的标准(名称)的东西