Java动态代理 – 如何引用具体类
我有一个与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
的具体实现中捕获execute
调用,例如FooImpl
。 可以这样做吗?
非常感谢
使用动态代理拦截方法的方法是:
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)。