具体类的动态代理

时间:2011-10-24 16:04:13

标签: java reflection dynamic-proxy

我想在Java程序中定义一个方法拦截器,换句话说我希望在每次方法调用时都执行一个行为。 此应用程序不在应用程序服务器中执行,因此我无法使用EJB调用拦截器。 我在标准Java库中找到了一个很好的Proxy API,但它有限,因为它需要代理创建中的接口:

 Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                                      new Class[] { Foo.class },
                                      handler);

是否有类似的API不强制将Foo.class声明为接口?

4 个答案:

答案 0 :(得分:7)

为什么不使用CGLIB?有关详细信息,请参阅this article

  

如果要代理没有接口的旧类,该怎么办?   您可以使用CGLIB。 CGLIB是一个功能强大的高性能代码   生成库。在封面下,它使用ASM,虽然小而快   字节码操作框架,将现有的字节代码转换为   生成新的类。 CGLIB比JDK动态代理更快   做法。本质上,它动态生成一个子类来覆盖   代理类的非final方法和wire up挂钩   回调用户定义的拦截器。

答案 1 :(得分:1)

不幸的是,类没有这样的API。许多框架都使用像CGLIB这样的字节码生成库来实现这一目标。

答案 2 :(得分:1)

您可以尝试其中一个模拟类。最简单的方法可能是子类,你的类。或者您可以使用AOP注入所需的日志记录代码。

答案 3 :(得分:0)

sun.misc.ProxyGenerator可用于生成代理类,并且不会检查他们的"接口"都是接口。它的generateClassFile方法将字节码作为字节数组提供给您,您可以将其保存以链接到将来的构建版本或使用第三方工具进行更改。

请注意,如果有任何"接口"有一个最终方法,当您尝试加载该类时,您将收到错误。