我有一个与java中的动态代理相关的问题。
假设我有一个名为Foo
的接口,其方法为execute
,类为FooImpl implements Foo
。
当我为Foo
创建代理时,我有类似的内容:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class[] { Foo.class },
handler);
假设我的调用处理程序如下所示:
public class FooHandler implements InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args) {
...
}
}
如果我的调用代码看起来像
Foo proxyFoo = (Foo) Proxy.newInstance(Foo.getClass().getClassLoader(),
new Class[] { Foo.class },
new FooHandler());
proxyFoo.execute();
如果代理可以从execute
界面拦截上述来电Foo
,那么FooImpl
会在哪里播放?也许我正在以错误的方式查看动态代理。我想要的是能够从execute
的具体实现中捕获Foo
调用,例如FooImpl
。可以这样做吗?
非常感谢
答案 0 :(得分:3)
使用动态代理拦截方法的方法是:
public class FooHandler implements InvocationHandler {
private Object realObject;
public FooHandler (Object real) {
realObject=real;
}
public Object invoke(Object target, Method method, Object[] arguments) throws Throwable {
if ("execute".equals(method.getName()) {
// intercept method named "execute"
}
// invoke the original methods
return method.invoke(realObject, arguments);
}
}
通过以下方式调用代理:
Foo foo = (Foo) Proxy.newProxyInstance(
Foo.class.getClassLoader(),
new Class[] {Foo.class},
new FooHandler(new FooImpl()));
答案 1 :(得分:2)
如果你想委托FooImpl这样的Foo实现,只需让你的InvocationHandler成为另一个Foo实例的包装器(传递给构造函数),然后发送一个FooImpl实例作为委托。然后,在handler.invoke()
方法内,调用method.invoke(delegate,args)。