BCEL==monkeypatching 用于 java 吗?
-
09-06-2019 - |
题
前几天一位同事向我指出 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 比使用猴子补丁更好。它对于第三方库可能相当有用。
不隶属于 StackOverflow