2011-09-04 74 views

回答

32

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

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

Spring Frameworkuses Proxies to implement its AOP support,其中包括支持声明性事务。它也使用代理来执行适当的范围。

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

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

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

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

14

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

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

一些字节码操作库是:

+1

关于真实项目:我知道,playFramework使用了Javaassist。在这种情况下,我们有源代码...并且我推测,Hibernate也使用javassist。 – user471011

+1

好吧说吧。 –

0

ASM项目的用户页面列出了数十个广泛使用的Java项目和使用ASM进行字节码分析和操作的框架。http://asm.ow2.org/users.html

相关问题