我想在Java程序中定义一个方法拦截器,换句话说,我想在每个方法调用时执行一个行为。此应用程序不在应用服务器中执行,因此我不能在调用拦截器周围使用EJB。我在标准Java库中找到了一个不错的代理API,但它的局限性在于它需要在代理创建中使用接口:
Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
new Class[] { Foo.class },
handler);
是否有类似的API不强制Foo.class被声明为接口?
为什么不使用CGLIB ?更多信息请参阅本文。
如果你想代理没有接口的遗留类怎么办?您可以使用CGLIB。CGLIB是一个功能强大的高性能代码一代图书馆。在掩护下,它使用ASM,小而快字节码操作框架,将现有字节码转换为生成新类。CGLIB比JDK动态代理快的方法。本质上,它动态地生成一个子类来重写被代理类的非final方法和连接的钩子回调用户定义的拦截器
遗憾的是,没有这样的类API。许多框架都使用像CGLIB这样的字节码生成库来实现这一点。
您可以尝试其中一个mock类。最简单的方法可能是创建类的子类。或者你可以使用AOP注入你想要的日志代码。
sun.misc。ProxyGenerator可以用来生成代理类,并且不检查它们的"接口"是否都是接口。它的generateClassFile方法将字节码作为字节数组提供给您,您可以将其保存以链接到将来的构建或使用第三方工具进行更改。
请注意,如果任何一个"接口"有一个final方法,当你试图加载该类时,你会得到一个错误。