【发布时间】:2011-11-09 23:39:49
【问题描述】:
我知道 Javassist 是一个 Java 库,它提供了一种操作应用程序的 Java 字节码的方法。
好的,但为什么我们需要操作字节码?
有什么真实的例子吗? 任何真正的应用程序,javassist 在哪里使用?
【问题讨论】:
我知道 Javassist 是一个 Java 库,它提供了一种操作应用程序的 Java 字节码的方法。
好的,但为什么我们需要操作字节码?
有什么真实的例子吗? 任何真正的应用程序,javassist 在哪里使用?
【问题讨论】:
【讨论】:
一个常见的应用是在运行时生成代理类,即在运行时创建一个子类来拦截所有的方法调用。例子:
Hibernate 使用代理拦截实体上的方法调用以实现延迟加载,即在第一次访问时从数据库中获取对象。
Spring 框架 uses Proxies to implement its AOP support,其中包括支持声明式事务。它还使用代理来执行适当的范围界定。
EJB 使用代理来实现容器管理的事务、授权检查以及应用用户定义的拦截器。
CDI 实现还必须代理托管 bean 以确保正确的作用域。我怀疑他们也使用了字节码工程库。
我最近使用 Javassist 实现了方法返回值的透明缓存,通过拦截所有方法调用并仅在第一次调用时委托给超级实现。
注意java.lang.reflect.Proxy可以在运行时生成代理类,但只能实现接口,不能扩展类。以上所有用例都需要类的代理。
【讨论】:
ASM 项目的用户页面列出了几十个使用 ASM 进行字节码分析和操作的广泛使用的 Java 项目和框架。 http://asm.ow2.org/users.html
【讨论】:
扩展 Meriton 的答案并提供一个真实的使用示例:
Hibernate-core (5.2.8.Final) 使用 javaassit (3.20.0-GA):
https://mvnrepository.com/artifact/org.hibernate/hibernate-core/5.2.8.Final
【讨论】: