具体类的动态代理

2022-09-03 02:52:01

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

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

有没有类似的API不强制Foo.class被声明为接口?


答案 1

为什么不使用CGLYB?有关详细信息,请参阅此文章

如果要代理没有接口的旧类,该怎么办?您可以使用 CGLIB。CGLIB 是一个功能强大的高性能代码生成库。在幕后,它使用ASM(一个小而快速的字节码操作框架)来转换现有的字节码以生成新类。CGLIB 比 JDK 动态代理方法更快。从本质上讲,它动态生成一个子类来覆盖代理类的非最终方法,并连接回调用户定义拦截器的钩子。


答案 2

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