前几天一位同事向我指出 BCEL 从他的解释和快速阅读中我可以看出,这是一种在运行时修改字节码的方法。我的第一个想法是这听起来很危险,第二个想法是这听起来很酷。然后我又想了想,我想起了 关于猴子补丁的codinghorror帖子 并意识到这基本上是同一件事。有人用过 BCEL 做过任何实际的事情吗?我是否正确,这基本上是运行时猴子修补,还是我错过了一些东西?

有帮助吗?

解决方案

它比经典的猴子修补要低一些,根据我的阅读,已经加载到虚拟机中的类不会更新。它只支持再次保存到类文件中,不支持修改运行时类。

其他提示

来自 BCEL 的常见问题解答:

问:我可以用BCEL动态创建或修改类吗?

A:BCEL在UTIL软件包,即ClassLoader和Javawrapper中包含有用的类。请查看ProxyCreator示例。

但猴子补丁是...嗯……有争议,如果您的语言不支持它,您可能不应该使用它。

如果您有一个好的用例,我可以建议嵌入 Jython 吗?

您可能会将其视为猴子修补。我宁愿不使用它(也许我从来没有遇到过它的良好用例?),但要熟悉它(了解 Spring 和 Hibenrate 如何使用它以及为什么)。

看这个现实世界的例子: Jawk - 编译器模块. 。BCEL 对于“编译”您的自定义语言很有用。

BCEL 不支持猴子修补,它只是使用字节码进行操作,并可能将其加载到自定义类加载器中。然而你 可以在JVM上实现monkeypatching 使用像BCEL和Java代理这样的库。Java 代理(由 -javaagent 参数加载)可以访问 Instrumentation API 并修改加载的类。通过一些桥梁来实现它并不难。

但要记住:

  • 我不确定是否必须使用 -javaagent 是您想要的。
  • 在任何语言中,猴子补丁都可能导致难以预测的行为。
  • 您可以修改一个方法。理论上,您还可以添加一些方法,但是您需要针对修改(修补)的类来编译项目。我认为这会造成很多痛苦,而且不值得。有其他语言支持它(例如Groovy)或支持类似的东西(例如Scala 中的隐式转换)。
  • 精心设计你的 API 比使用猴子补丁更好。它对于第三方库可能相当有用。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top