gpt4 book ai didi

java - 如何使用 AOP 在参数上拦截 super 中的方法调用?

转载 作者:行者123 更新时间:2023-12-01 14:25:57 24 4
gpt4 key购买 nike

我正在扩展一个类并覆盖一个方法。我想要做的就是调用 super,但是修改后的参数会在调用其方法之一时被拦截。一个例子更清楚:

// Foo is an interface and also this method is part of an interface
@Override
public void foo(Foo foo) {
// I want to intercept the call to foo.bar() in super
super.foo(foo);
}

我宁愿使用不需要自己的编译器的工具。什么是最佳的?

最佳答案

鉴于 Foo 是一个接口(interface),您可以考虑使用 dynamic proxy那会:

  1. 包装原来的foo
  2. 拦截所有消息并转发给原来的foo

有一个完整的example在上面的链接中。这只是想法:

public class DebugProxy implements java.lang.reflect.InvocationHandler {

private Object obj;

private DebugProxy(Object obj) {
this.obj = obj;
}

public Object invoke(Object proxy, Method m, Object[] args) throws Throwable
{
System.out.println("before method " + m.getName());
return m.invoke(obj, args);
}
}

Foo original = ... ;
Foo wrapper = (Foo) java.lang.reflect.Proxy.newProxyInstance(
original.getClass().getClassLoader(),
original.getClass().getInterfaces(),
new DebugProxy(original));
wrapper.bar(...);

请注意,如果 Foo 不是接口(interface),您仍然可以子类化 Foo 并手动覆盖所有方法以转发它们。

class SubFoo extends Foo
{
Foo target;

SubFoo( Foo target ) { this.target = target };

public void method1() { target.method1(); }

...
}

这是伪代码,我还没有测试过。在这两种情况下,包装器都允许您拦截 super 中的调用。

当然,wrapper 和原来的 Foo 不是同一个类,所以如果 super 使用

  1. 反射(reflection)
  2. instanceof
  3. 或直接访问实例变量(不通过 getter/setter)

,那么它可能有问题。

希望我正确理解了您的问题并且对您有所帮助。

关于java - 如何使用 AOP 在参数上拦截 super 中的方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2646510/

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