字节码操作有哪些合法用途,人们如何在实践中实现基于字节码操作的解决方案?
更新:--我应该更清楚地说明,这个问题实际上是关于人们使用什么模式和技术在字节码操作的帮助下使代码飞起来的。
类似于前面提到的面向方面的编程,或者动态构建代理对象以及类似的技术。
发布于 2010-04-23 10:05:33
字节码操作允许您实现任意复杂(且有趣的)程序转换,如:
范围是无穷无尽的;这只是一个小样本。
至于这通常是如何完成的,请启动这里。
发布于 2010-04-23 10:07:16
因此,可以读取字节码来实现解释器/ JVM。在为另一种语言(例如Scala和Jython)实现Java编译器或编译器时,可以编写/生成字节码。您可以执行字节码操作来优化字节码(如果您想生产和销售字节码优化器,或者您需要它作为内部工具,使您的公司代码在竞争中处于领先地位)。类似地,您可能会操纵字节码,以便在分发之前混淆它。您还可以为面向方面的编程执行字节码操作;例如,您可能希望插入钩子(可能是为了计时、日志记录或其他原因),如果操作字节码比编辑所有源文件更简单或成本更低(例如,如果源代码不可用或来自许多不同的源,并不是所有源代码都在某个人的控制之下,或者说服这些团队添加这样的钩子既昂贵又费时),这可能是一种情况,即插入对最终字节码输出的修改,而不是试图修改原始代码(这可能需要更新或维护单独的叉),或者从只提供字节码的第三方购买源代码)。
您可以自己操作字节码,尽管有许多现有的开源库和框架可以这样做,包括BCEL和ASM (仅举几个例子)。
发布于 2010-04-23 10:28:30
论文面向方面的设计模式 (PDF)和面向方面的设计原则:面向对象设计的启示 (PDF)描述了AOP/字节码操作的一些模式。
就我个人而言,我使用了ASM在一个框架中的字节码操作来为使用该框架的类生成一些样板代码。该框架需要客户端代码的自定义等于()和hashCode()方法,因此我通过在Java代理中挂钩,从而在ClassLoader加载类时修改字节码来实现ClassLoader。我也多次使用CGLIB来生成动态代理(如果这算AOP的话)。
https://stackoverflow.com/questions/2697657
复制相似问题