前几天,一位同事向我指出了BCEL,从他的解释和快速阅读中我可以看出,这是一种在运行时修改字节码的方法。我的第一个想法是它听起来很危险,我的第二个想法是它听起来很酷。然后我想了想,想起了关于猴子补丁的编码恐怖帖子,并意识到这基本上是一回事。有没有人用过 BCEL 做任何实用的事情?我是对的,这基本上是运行时猴子补丁,还是我错过了什么?
shs
问问题
1125 次
5 回答
3
来自 BCEL 的常见问题解答:
问:我可以使用 BCEL 动态创建或修改类吗?
A:BCEL在util包中包含了一些有用的类,即ClassLoader和JavaWrapper。看一下ProxyCreator的例子。
但是猴子补丁是……嗯……有争议,如果你的语言不支持它,你可能不应该使用它。
如果您有一个很好的用例,我可以建议嵌入 Jython 吗?
于 2008-09-03T22:23:28.483 回答
1
它比经典的猴子补丁要低级一些,根据我的阅读,已经加载到 VM 中的类没有更新。它只支持再次保存到类文件中,不支持修改运行时类。
于 2008-09-03T20:15:15.780 回答
0
您可能会将其视为猴子修补程序。我不喜欢使用它(也许我从来没有遇到过它的好用例?),但要熟悉它(了解 Spring 和 Hibenrate 如何使用它以及为什么使用它)。
于 2008-09-04T10:13:56.980 回答
0
请参阅这个真实世界的示例:Jawk - 编译器模块。BCEL 对于“编译”你的自定义语言很有用。
于 2010-02-03T23:18:46.113 回答
0
BCEL 不支持猴子补丁,它只是使用字节码进行操作,并可能将其加载到自定义类加载器中。但是,您可以使用 BCEL 和 Java 代理等库在 JVM 上实现猴子补丁。Java 代理(由 -javaagent 参数加载)可以访问 Instrumentation API 并修改加载的类。通过一些桥梁来实现它并不难。
但要记住:
- 我不确定是否必须使用 -javaagent 是您想要的。
- 在任何语言中,猴子修补都可能导致难以预测的行为。
- 您可以修改方法。理论上,您也可以添加一些方法,但您需要针对修改(修补)的类编译项目。我认为这会造成很多痛苦,而且不值得。有其他语言支持它(例如 Groovy)或支持类似的东西(例如 Scala 中的隐式转换)。
- 设计好你的 API 比使用猴子补丁更好。它可能对第三方库非常有用。
于 2013-01-20T12:41:44.030 回答