2010-04-23 163 views
7

字节码操作有什么合法用途,以及人们在实践中如何实现基于字节码操作的解决方案?字节码操作模式

更新:我应该更清楚地知道,这个问题实际上是关于人们使用什么样的模式和技术,通过字节码操作来使代码飞行。

类似于面向方面的编程已经提到或建立代理对象和类似的技术。

回答

8

字节码操作,您可以实现任意复杂的(和有趣的)程序的转换,如:

  • 入境/出境记录代码所选功能
  • 安全变换存根进出某些API的
  • API替代,例如,在测试工具中运行代码。

范围是无止境的;这只是一个小样本。

至于这是如何通常完成,开始here

+0

也许我应该更清楚这一点。我已经知道这些库,并且我知道Java是如何在字节码级别上工作的。我真正想知道的是,人们发明了很多很酷的技术来做你不能做的事情,所以当我偶然发现这些问题时,我会考虑这些解决方案。 – ahe 2010-04-23 10:12:21

4

因此,可以读取字节码来实现解释器/ JVM。当实现一个Java编译器或一个编译器来执行针对JVM的另一种语言(例如ScalaJython)时,可以编写/生成字节码。您可以执行字节码操作来优化字节码(如果您希望生产和销售字节码优化器,或者您需要它作为内部工具来让贵公司的代码在竞争中脱颖而出)。以类似的方式,您可能会操纵字节码以在分发之前对其进行混淆。您也可以执行aspect-oriented programming的字节码操作;例如,您可能想要插入钩子(可能用于计时或日志记录目的或出于某种其他原因),并且如果操作字节码比编辑所有源文件更简单或更便宜(例如可能是这种情况源代码不可用或来自许多不同的来源,并非所有这些来源都可能在某人的控制之下,或者为了说服这些团队增加这样的挂钩可能是昂贵且耗时的),这可能是它会使将修改插入到最终的字节码输出中,而不是尝试修改原始代码(可能需要上游或维护单独的分支,或从仅提供字节码的第三方购买源代码)。

尽管现在有许多现有的开源库和框架可以操作,但您可以自己操作字节码,包括BCELASM等等。

+0

“操纵字节码比编辑所有源文件要便宜” - 这是怎么回事? – kgdinesh 2016-08-27 07:15:54

+1

@DineshBabu改写,提供了一些例子来说明 – 2016-08-28 19:45:10

+0

谢谢,但字节码操作是如何作为设计模式出现的?如果我们从Java的领域走出来,并且总体上谈论编程语言,并不是每个人都有这个特性。他们如何完成任务? – kgdinesh 2016-08-29 00:37:04

3

有一些论文Patterns of Aspect-Oriented Design(PDF)和Aspect-Oriented Design Principles: Lessons from Object-Oriented Design(PDF),它们描述了AOP /字节码操作的一些模式。

就我个人而言,我使用ASM的的字节码操作来为使用该框架的类生成一些样板代码。该框架需要客户端代码的自定义equals()和hashCode()方法,所以我通过挂接Java Agent来修改字节码,因为ClassLoader会加载这些类。我也多次使用CGLIB来产生动态代理(如果这算作AOP)。

0

某些框架(如BEA KODO(实现Java数据对象规范)使用字节码操作来“增强”普通旧Java对象并基于XML描述添加持久性逻辑。

因此,数据库映射信息然后在字节码上自动生成。