gpt4 book ai didi

java - 如何找到引用方法的第一个声明方法

转载 作者:行者123 更新时间:2023-11-30 11:58:58 25 4
gpt4 key购买 nike

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

public interface MyInterface<T> {

void foo(T param);
}

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

void foo(T param) {

}
}

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

public interface MyExtendedInterface extends MyInterface<Bar> {

@Override
void foo(Bar param);

// Further declared methods
}

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

那么有没有办法访问最初声明方法的方法呢?关于这个例子,有没有办法找出 foo(Bar param) 最初是在 MyInterface 中声明的,并可以访问相应的 Method 实例?

我已经尝试扫描基类方法以通过名称和参数类型进行匹配,但是随着泛型的出现和 MyImplementation.getMethod("foo", Bar.class) 显然这行不通抛出一个 NoSuchMethodException。我已经知道 MyExtendedInterface 类型 MyInterfaceBar。因此,如果我可以在 MyImplementation 上创建某种“类型化 View ”,我的数学算法就可以实际运行。

附加信息:

我为 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
}
}

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

最佳答案

好的,这是我想出的解决方案:据我所知,基类及其泛型结构(T 在这种情况下意味着什么)以及 MyExtendedInterface 类型 MyInterfaceBar 我可以扫描基本实现以查找可能的匹配项,如下所示(伪代码):

for all methods {

skip those with non matching name and parameters length;

for all generic parametertypes {

if typename = T then concrete type has to be Bar
...
}
}

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

关于java - 如何找到引用方法的第一个声明方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2804894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com