【问题标题】:Redefining JDK Bootstrap classes重新定义 JDK Bootstrap 类
【发布时间】:2018-09-04 22:09:32
【问题描述】:

是否可以在运行时使用 Java 代理重新定义 Bootstrap 类? 更具体地说,我想在加载后重新定义java.io运行时中的一些类。

【问题讨论】:

    标签: bytecode javaagents byte-buddy


    【解决方案1】:

    是的,可以使用能够重新定义类的 Javaagent,因为一旦您的代理被激活,java.io 中的许多类就会被加载。为此,您必须使用声明Can-Redefine-ClassesCan-Retransform-Classes 属性的premain 方法创建一个jar 文件。

    这样做,您可以注册具有重新转换功能的ClassFileTransformer,并重新转换您需要更改的类。请注意,这不允许您通过例如添加字段或方法来更改类文件布局。

    您可以使用诸如 ByteBuddy 之类的库,它提供了重新转换类 using its AgentBuilder to simplify the process 的标准方法。请注意,您必须定义一个不排除所有引导程序类的忽略匹配器,这是完成此操作的默认值。

    【讨论】:

    • 谢谢拉斐尔。有没有办法使用该机制将字段注入 java.lang.Runnable ?如果我理解正确,我们不能动态改变类布局。
    • 不,您不能向此类添加字段,该字段将始终在您的代理之前加载。
    • 将字段添加到 interface 无论如何都是有限的,因为接口中只允许使用静态常量。
    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多