是否可以在运行时使用Java代理重新定义Bootstrap类?更具体地说,我想在加载后的运行时在java.io
包中重新定义一些类。
是的,可以使用能够重新定义类的Javaagent,因为一旦激活了代理,java.io
中的许多类就已经加载了。为此,您必须使用premain
方法创建一个jar文件,该方法声明了Can-Redefine-Classes
或Can-Retransform-Classes
属性。
这样,您可以注册具有重新转换功能的ClassFileTransformer
并重新转换您需要更改的类。请注意,这不允许您通过添加字段或方法来更改类文件布局。
您可以使用像ByteBuddy这样的库,它提供了重新转换类using its AgentBuilder
to simplify the process的标准方法。请注意,您必须定义一个不会排除所有引导程序类的忽略匹配器,这是实现此目的的默认值。