16

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

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

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

4

4 回答 4

6

为什么不使用CGLIB?有关更多信息,请参阅本文

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

于 2011-10-24T16:06:36.013 回答
1

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

于 2011-10-24T16:06:37.703 回答
1

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

于 2011-10-24T16:07:34.033 回答
0

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

请注意,如果任何“接口”具有最终方法,则在尝试加载类时会出现错误。

于 2016-05-15T09:23:50.100 回答