Java 字节码操作:将方法添加到 jdk 抽象 class
Java Byte Code manipulation: Adding a method to a jdk abstract class
问题:
我需要在java.util.prefs.Preferences抽象class中添加一个方法,原因如下:
- 我已经实现了一个可集群的首选项实现,我需要用 java.util.prefs.Preferences 提供的基本 api 来丰富它。
- 我不想破坏使用合同,即客户端获取首选项实现并仅使用首选项 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。因此,这也不起作用。
您想改为做什么:
- 编写一个包装器对象,一些
EnhancedPreferences
委托给它保存在字段中的另一个 Preferences
对象。
- 编写实用程序 class,使用
static
方法对 Preferences
对象进行操作。
问题: 我需要在java.util.prefs.Preferences抽象class中添加一个方法,原因如下:
- 我已经实现了一个可集群的首选项实现,我需要用 java.util.prefs.Preferences 提供的基本 api 来丰富它。
- 我不想破坏使用合同,即客户端获取首选项实现并仅使用首选项 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。因此,这也不起作用。
您想改为做什么:
- 编写一个包装器对象,一些
EnhancedPreferences
委托给它保存在字段中的另一个Preferences
对象。 - 编写实用程序 class,使用
static
方法对Preferences
对象进行操作。