我知道Javassist是一个Java库,提供了操纵应用程序的Java字节码的方法。Javassist。什么是主要思想和真正的用途?
好的,但为什么我们需要操纵字节码?
任何一个真实的例子? 任何真正的应用程序,其中javassist使用?
我知道Javassist是一个Java库,提供了操纵应用程序的Java字节码的方法。Javassist。什么是主要思想和真正的用途?
好的,但为什么我们需要操纵字节码?
任何一个真实的例子? 任何真正的应用程序,其中javassist使用?
的常见应用是在运行时生成代理类,即,在运行时创建一个子类,拦截所有的方法调用。示例:
休眠使用代理拦截实体上的方法调用来实现延迟加载,即从第一次访问数据库时获取对象。
Spring Frameworkuses Proxies to implement its AOP support,其中包括支持声明性事务。它也使用代理来执行适当的范围。
EJB使用代理来实现容器管理事务,授权检查以及应用用户定义的拦截器。
CDI实现还必须代理托管的bean以确保正确的范围。我怀疑他们也使用了一个字节码工程库。
I最近使用Javassist通过拦截所有方法调用并仅在第一次调用时委托给超级实现来实现方法返回值的透明缓存。
请注意,java.lang.reflect.Proxy
可以在运行时生成代理类,但只能实现接口,不能扩展类。所有上述用例都需要代理类。
ASM项目的用户页面列出了数十个广泛使用的Java项目和使用ASM进行字节码分析和操作的框架。http://asm.ow2.org/users.html
为了延长梅里答案,并提供使用的一个真实的例子:
休眠芯(5.2.8.Final)使用javaassit(3.20.0-GA):
https://mvnrepository.com/artifact/org.hibernate/hibernate-core/5.2.8.Final
关于真实项目:我知道,playFramework使用了Javaassist。在这种情况下,我们有源代码...并且我推测,Hibernate也使用javassist。 – user471011
好吧说吧。 –