Javassist。主要思想是什么,真正的用途是什么?

标签 java bytecode javassist

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

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

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

最佳答案

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

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

Spring 框架 uses Proxies to implement its AOP support ,除其他外,它支持声明式事务。它还使用代理来执行适当的范围界定。

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

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

最近使用 Javassist 实现了方法返回值的透明缓存,通过拦截所有方法调用并仅在第一次调用时委托(delegate)给 super 实现。

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

关于Javassist。主要思想是什么,真正的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7297565/

相关文章:

Javassist:如何创建代理的代理?

java - 如何使用 Spring HATEOAS 添加查询字符串参数?

java - 如何在android中首次运行时为变量设置值

java - 如何将项目添加到同一父类(super class)型的通用列表中?

java - 我的 friend 指出[在 main 中抛出异常是不合适的]。我应该如何以及在哪里修复它?

class - JVM 如何决定一个类 “belongs”(例如内部类或嵌套类)是否属于另一个类?

java - 如何直接在java字节码上写/创建.class文件?

java - 使用 Javassist 获取类的初始值设定项

java.lang.VerifyError : Bad local variable type after bytecode instrumentation 错误

playframework - 在 helpers.CheatSheetHelper$2 无效常量类型 : 15 上 Play 1.2.x UnexpectedException ContinuationEnhancer