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)。