Java字节代码操作:向jdk抽象类添加方法

时间:2015-05-12 16:51:33

标签: java java-bytecode-asm bytecode-manipulation

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

  1. 我已经实现了一个可群集的首选项实现,我需要用java.util.prefs.Preferences提供的基本api来丰富它。
  2. 我不想破坏使用合同,即客户端获取Preference实现并仅使用Preferences api(显然是富集的)。
  3. 如何将方法添加到现有Java字节码?

1 个答案:

答案 0 :(得分:2)

对于java.util.prefs.Preferences,你运气不好。除非您更改放在the bootstrap class path上的类,否则无法检测此类。即使如此,请注意,这违反了JVM的用户许可协议,以便发布具有更改的引导类路径的安装。

通常,您可以使用Java代理在加载时更改类。这样,您可以添加方法。但是,JVM在内部使用Preferences类,并且在加载代理之前加载。这样,代理就无法应用。

或者,Instrumentation interface允许您在运行时更改已加载的类。然而,使用这种方法,添加方法是非法的,这也是为什么它不起作用的原因。

作为第三个选项,您可以考虑实现一个隐藏Preferences类的子优先级类加载器,但不允许除引导类加载器之外的类加载器在{{1}中定义类包。因此,这也不起作用。

你想做什么:

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