Java 字节码操作:将方法添加到 jdk 抽象 class

Java Byte Code manipulation: Adding a method to a jdk abstract class

问题: 我需要在java.util.prefs.Preferences抽象class中添加一个方法,原因如下:

  1. 我已经实现了一个可集群的首选项实现,我需要用 java.util.prefs.Preferences 提供的基本 api 来丰富它。
  2. 我不想破坏使用合同,即客户端获取首选项实现并仅使用首选项 api(显然是丰富的首选项)。

如何向现有 Java 字节码添加方法?

对于java.util.prefs.Preferences,你运气不好。除非您更改放在 the bootstrap class path 上的 classes,否则无法检测此 class。即使,请注意,使用更改的 bootstrap class 路径运送安装也被视为违反了 JVM 的用户许可协议。

通常,您可以在加载期间使用 Java 代理更改 class。这样,您可以添加方法。但是,Preferences class 由 JVM 内部使用,它在 加载代理之前 加载代理。这样代理就申请不了了

或者,Instrumentation interface 允许您在运行时更改加载的 class。使用这种方法,但是添加方法是非法的,这就是为什么这也不起作用。

作为第三种选择,您可以考虑实现一个子优先 class 加载器,它隐藏 Preferences class 但没有 class 加载器,除了 bootstrap class 加载程序允许在 java.* 包中定义 class。因此,这也不起作用。

您想改为做什么:

  1. 编写一个包装器对象,一些 EnhancedPreferences 委托给它保存在字段中的另一个 Preferences 对象。
  2. 编写实用程序 class,使用 static 方法对 Preferences 对象进行操作。