【发布时间】:2018-09-04 22:09:32
【问题描述】:
是否可以在运行时使用 Java 代理重新定义 Bootstrap 类?
更具体地说,我想在加载后重新定义java.io包运行时中的一些类。
【问题讨论】:
标签: bytecode javaagents byte-buddy
是否可以在运行时使用 Java 代理重新定义 Bootstrap 类?
更具体地说,我想在加载后重新定义java.io包运行时中的一些类。
【问题讨论】:
标签: bytecode javaagents byte-buddy
是的,可以使用能够重新定义类的 Javaagent,因为一旦您的代理被激活,java.io 中的许多类就会被加载。为此,您必须使用声明Can-Redefine-Classes 或Can-Retransform-Classes 属性的premain 方法创建一个jar 文件。
这样做,您可以注册具有重新转换功能的ClassFileTransformer,并重新转换您需要更改的类。请注意,这不允许您通过例如添加字段或方法来更改类文件布局。
您可以使用诸如 ByteBuddy 之类的库,它提供了重新转换类 using its AgentBuilder to simplify the process 的标准方法。请注意,您必须定义一个不排除所有引导程序类的忽略匹配器,这是完成此操作的默认值。
【讨论】: