我正在扩展一个类并覆盖一个方法。我要做的只是调用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
是一个接口,您可以考虑使用动态代理,该代理将:
上面的链接中有一个完整的示例。这只是想法:
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使用
instanceof
,则可能会出现问题。
希望我正确理解您的问题,对您有所帮助。
我知道如何使用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]::没有找到与依