Java Instrumentation Agent是否在类中支持“新方法定义”?

ha9*_*3ar 2 java instrumentation javaagents

我使用Instrumentation#redefineClasses(ClassDefinition)method 重新加载了我的测试应用程序类。当我尝试在类文件中添加新方法并从现有方法中调用它时。我这样做并不高兴。但是,当我调用某些现有方法和其他Java Built-In Library方法时,它运行良好。

我的问题是-Oracle或Open JDK实现是否知道/认识到此限制?我怀疑即使您可以使用INstrumentation Manifest.MF文件重新定义/重新转换类,也必须对它的使用范围有一定的限制。

有人对此事有经验吗?

Ole*_*leg 6

来自Instrumentation.html#redefineClasses

重新定义可能会更改方法主体,常量池和属性。定义不得添加,删除或重命名字段或方法,更改方法的签名或更改继承。这些限制可能会在将来的版本中取消。在应用转换之后,才会检查,验证和安装类文件字节,如果结果字节错误,则此方法将引发异常。

因此,答案是否定的,这是不可能的。

  • 我认为,可以公平地说,无法通过此API添加方法。您可以通过将每个类转换为Facade来解决此问题,但是,您仍然没有通过此API添加方法,而是在自己的方法分派实现之上实现了此功能。如果您称其为“可能”,那么几乎一切皆有可能,因为您总是可以加载一个新的软件(您自己的JVM或其他任何东西)来假装按照您的意图在流程中进行工作…… (2认同)