当前位置: 首页 > 面试题库 >

如何使用AOP截取super中对参数的方法调用?

金子轩
2023-03-14
问题内容

我正在扩展一个类并覆盖一个方法。我要做的只是调用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是一个接口,您可以考虑使用动态代理,该代理将:

  1. 包装原始foo
  2. 拦截所有消息并将其转发给原始foo

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

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不是接口,您仍可以Foo手动继承并覆盖所有方法以转发它们。

class SubFoo extends Foo
{
    Foo target;

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

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

    ...
}

这是伪代码,我还没有测试过。在这两种情况下,都可以使用包装器拦截中的呼叫super

当然,包装器与原始包装器不具有相同的类Foo,因此如果super使用

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

,则可能会出现问题。

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



 类似资料:
  • 我知道如何使用Volley GET方法进行登录,但如果我需要指定一个特定的“id”,该怎么办?我使用intent将列表项的“id”从远程数据库传递给另一个活动。putExtra。在下一个活动中,我将如何利用凌空的GET方法来解析和显示另一个表中使用传递的“id”的数据? 在浏览器中,我可以使用以下内容获得具有指定url和参数的响应: 但是我不知道如何将该url传递给Volley请求并在listvi

  • 问题内容: 我正在使用Spring AOP并具有以下方面: 以上方面拦截方法执行。方法将字符串作为输入。但是我需要在方法内部记录传递给方法的输入。 有可能这样做吗? 问题答案: 您有几种选择: 首先,您可以使用返回的方法,其中包含建议方法的所有参数。您可能需要进行一些转换,具体取决于您想对它们进行什么处理。 其次,可以像这样使用切入点表达式: 那么您的方法可以改为

  • 我想截取在一个类的所有实例上调用的每个setter方法,然后在另一个类对象上调用一个方法,参数对应于第一个类的每个实例的一些字段值。为此,我想使用ByteBuddy API,但我也想为指定类的所有实例只创建一个子类 例如,我编写了以下代码: 我将为每个资源类型创建的每个子类保存在映射中,以便为每个资源类型只创建一个子类。这里的问题是,对于创建的子类的所有实例,传递给在目标对象上调用的方法“upda

  • 我想截获名为methodA的方法,其中一个参数的类型是String as blow,我应该怎么做。如何使用hasParameters()api?

  • 我试图截取Struts2 Action类的方法,以便使用Spring AOP打印方法开始和方法结束指示语句。 09:26:49,093跟踪[org.springframework.beans.factory.support.DefaultListableBeanFactory](HTTP-01H3463916-172.20.211.235-8543-5)忽略bean.string]::没有找到与依