Javassist。主要思想是什么?在哪里真正有用?
我知道Javassist是一个Java库,提供了一种操作应用程序的Java字节码的方法 好的,但是为什么我们需要操纵字节码呢 有真实的例子吗?Javassist。主要思想是什么?在哪里真正有用?,java,bytecode,javassist,Java,Bytecode,Javassist,我知道Javassist是一个Java库,提供了一种操作应用程序的Java字节码的方法 好的,但是为什么我们需要操纵字节码呢 有真实的例子吗? 任何使用javassist的真实应用程序?字节码操作都是有用和必要的,特别是当您没有特定项目的源代码时。假设您只有某个项目的字节码(比如jar文件),但您希望以某种方式更改代码的行为,字节码操纵库在这种情况下可以提供帮助。字节码操作的优点是不需要重新编译代码,可以在操作后直接执行 我使用字节码操作来做一些程序分析。给定一个库,我想知道在运行时调用了库中的
任何使用javassist的真实应用程序?字节码操作都是有用和必要的,特别是当您没有特定项目的源代码时。假设您只有某个项目的字节码(比如jar文件),但您希望以某种方式更改代码的行为,字节码操纵库在这种情况下可以提供帮助。字节码操作的优点是不需要重新编译代码,可以在操作后直接执行 我使用字节码操作来做一些程序分析。给定一个库,我想知道在运行时调用了库中的哪些方法。我可以使用字节码操作插入
System.out.println(“方法名称”)方法开头的代码>语句。因此,在运行时,它将打印出调用了哪些方法
一些字节码操作库包括:
一个常见的应用程序是在运行时生成代理类,即在运行时创建一个子类来拦截所有方法调用。示例:
Hibernate使用代理拦截实体上的方法调用,以实现延迟加载,即在首次访问对象时从数据库中获取对象
Spring框架,它支持声明性事务。它还使用代理来实施适当的范围界定
EJB使用代理来实现容器管理的事务、授权检查和应用用户定义的拦截器
CDI实现还必须代理托管bean,以确保正确的作用域。我怀疑他们也使用字节码工程库
I最近使用Javassist来实现方法返回值的透明缓存,方法是拦截所有方法调用,只在第一次调用时委托给超级实现
请注意,java.lang.reflect.Proxy
可以在运行时生成代理类,但只能实现接口,不能扩展类。上述所有用例都需要类的代理。ASM项目的用户页面列出了几十个使用ASM进行字节码分析和操作的广泛使用的Java项目和框架 扩展Meriton答案并提供一个实际使用示例:
Hibernate核心(5.2.8.Final)使用JavaAssist(3.20.0-GA):
关于真实项目:我知道,playFramework使用了Javaassist。在这种情况下,我们有源代码。。。而我,Proped,Hibernate也使用javassist。