Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javassist。主要思想是什么?在哪里真正有用?_Java_Bytecode_Javassist - Fatal编程技术网

Javassist。主要思想是什么?在哪里真正有用?

Javassist。主要思想是什么?在哪里真正有用?,java,bytecode,javassist,Java,Bytecode,Javassist,我知道Javassist是一个Java库,提供了一种操作应用程序的Java字节码的方法 好的,但是为什么我们需要操纵字节码呢 有真实的例子吗? 任何使用javassist的真实应用程序?字节码操作都是有用和必要的,特别是当您没有特定项目的源代码时。假设您只有某个项目的字节码(比如jar文件),但您希望以某种方式更改代码的行为,字节码操纵库在这种情况下可以提供帮助。字节码操作的优点是不需要重新编译代码,可以在操作后直接执行 我使用字节码操作来做一些程序分析。给定一个库,我想知道在运行时调用了库中的

我知道Javassist是一个Java库,提供了一种操作应用程序的Java字节码的方法

好的,但是为什么我们需要操纵字节码呢

有真实的例子吗?
任何使用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。