具体类的动态代理

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

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

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

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

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

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

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

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

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