[英]Java Dynamic Proxy - How reference concrete class
我有一个与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();
如果代理可以拦截从Foo
接口execute
的上述调用,那么FooImpl
会在哪里播放? 也许我以错误的方式看待动态代理。 我想要的是能够从Foo
的具体实现(例如FooImpl
捕获execute
调用。 能做到吗?
非常感谢
使用动态代理拦截方法的方法是:
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()));
如果要委托给Foo实现,例如FooImpl,只需将InvocationHandler封装为另一个Foo实例的包装(传递给构造函数),然后将FooImpl实例作为委托发送。 然后,在handler.invoke()
方法内部,调用method.invoke(delegate,args)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.