Java 具体类的动态代理

Java 具体类的动态代理,java,reflection,dynamic-proxy,Java,Reflection,Dynamic Proxy,我想在Java程序中定义一个方法拦截器,换句话说,我想在每次方法调用时执行一个行为。 这个应用程序不是在应用程序服务器中执行的,因此我不能在调用拦截器周围使用EJB。 我在标准Java库中发现了一个不错的API,但它的局限性在于它需要在代理创建中使用一个接口: Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(), new Class[] { F

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

 Foo f = (Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),
                                      new Class[] { Foo.class },
                                      handler);
有没有类似的API不强制将Foo.class声明为接口

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

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


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

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

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


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

我是CGLIB新手。我的理解是,它在内存中生成类二进制,但现有的类加载器只是从文件系统中加载类,所以它如何使用自己的类加载器?链接到下,没有示例…
sun.misc.ProxyGenerator
在较新的java版本中不可用