Java Instrumentation Agent是否支持类中的新方法定义?

Java Instrumentation Agent是否支持类中的新方法定义?,java,instrumentation,javaagents,Java,Instrumentation,Javaagents,我使用Instrumentation#重定义类(ClassDefinition)方法重新加载了一个测试应用程序类。当我尝试在类文件中添加新方法并从现有方法调用它时。我这样做是不高兴的。但当我调用一些现有方法和其他Java内置库方法时,它工作得很好 我的问题是——Oracle或开放JDK实现是否知道/承认这一限制?我怀疑,即使您可以使用INstrumentation Manifest.MF文件重新定义/重新传输类,也一定会有一些限制 有人有这方面的经验吗?来自: 重新定义可能会更改方法体、常量池和

我使用
Instrumentation#重定义类(ClassDefinition)
方法重新加载了一个测试应用程序类。当我尝试在类文件中添加新方法并从现有方法调用它时。我这样做是不高兴的。但当我调用一些现有方法和其他Java内置库方法时,它工作得很好

我的问题是——Oracle或开放JDK实现是否知道/承认这一限制?我怀疑,即使您可以使用INstrumentation Manifest.MF文件重新定义/重新传输类,也一定会有一些限制

有人有这方面的经验吗?

来自:

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


因此答案是不可能的。

请注意:像JRebel这样的商业工具很容易处理这样的更改。@GhostCat是这样,但他们使用的是本机代理,而这不是问题所在。更重要的是要完成这幅图。你永远不知道未来的读者会寻找什么。同样的限制也适用于本机代理,而JRebel远不能轻松实现这一点,因为大量的工作使得该工具不适合生产。事实上,JRebel代理必须在启动时应用,以围绕所有用户类构建一个门面,使其可重新定义。我认为,公平地说,通过这个API添加方法是不可能的。您可以通过将每个类转换为facade来解决这个问题,但是,您仍然没有通过这个API添加方法,而是在您自己的方法分派实现之上实现这个特性。如果你称之为“这是可能的”,那么几乎一切都成为可能,因为你总是可以加载一个新的软件(你自己的JVM或任何东西),它假装在进程中做你想做的事情…