Javassist.主要思想是什么,实际用途在哪里?

2022-09-01 08:41:48

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

好吧,但是为什么我们需要操作字节码呢?

有什么真实的例子吗?任何真正的应用程序,javassist使用的地方?


答案 1

一个常见的应用程序是在运行时生成代理类,即在运行时创建一个拦截所有方法调用的子类。例子:

Hibernate使用代理来拦截实体上的方法调用以实现延迟加载,即在首次访问对象时从数据库中提取对象。

Spring框架使用代理来实现其AOP支持,其中包括对声明性事务的支持。它还使用代理来强制执行正确的范围。

EJB 使用代理来实现容器管理的事务、授权检查和应用用户定义的拦截器。

CDI 实现还必须代理托管 Bean 以确保正确的作用域。我怀疑他们也使用字节代码工程库。

我最近使用Javassist为方法返回值实现透明缓存,通过拦截所有方法调用,并且仅在第一次调用时委托给超级实现。

请注意,可以在运行时生成代理类,但只能实现接口,而不能扩展类。上述所有用例都需要类的代理。java.lang.reflect.Proxy


答案 2

字节码操作是有用且必要的,尤其是当您没有某些项目的源代码时。假设您只有某个项目的字节码(如jar文件),但您希望以某种方式更改代码的行为,字节码操作库在这种情况下可以提供帮助。字节码操作的优点是,您不需要重新编译代码,并且可以在操作后直接执行它。

我使用字节码操作来做一些程序分析。给定一个库,我想知道在运行时调用了库中的哪些方法。我可以使用字节码操作在方法的开头插入语句。因此,在运行时,它将打印出已调用的方法。System.out.println("method_name");

一些字节码操作库是:


推荐