优雅的方法来替换Java字节码中的实例的(类)类型

时间:2014-05-28 08:50:12

标签: java bytecode bytecode-manipulation

我已经在解决以下问题的解决方案上工作了一段时间。让我们说我有以下Java代码:

public class A {
  public void start() {
    List l = new ArrayList();
    l.add("abc");
    System.out.println( l.get(0) );
  }
}

编译此代码的结果是包含Java字节代码的类文件A.class。我写了ClassLoader,加载A.class并执行start()。我打算用A.class替换加载的new ArrayList()(字节代码)MyArrayList()

//Before
List l = new ArrayList();
//After
List l = new MyArrayList();

课程MyArrayList的定义与:class MyArrayList extends ArrayList

类似

1 个答案:

答案 0 :(得分:0)

您可以使用ASM之类的工具来解析文件,并将任何ArrayList的匹配项替换为MyArrayList。但是,这需要MyArrayList定义与ArraysList中定义的构造函数具有相同签名的构造函数。

下一个问题是您定义更改时。您有以下可能性:

  1. 在构建时更改实现:您可以编写一个应用转换的构建工具插件。
  2. 使用Java代理在运行时更改实现:Attach API允许您甚至在运行时更改已加载的类。
  3. 在第一次加载类之前更改实现:您可以使用自定义类加载器来加载已更改的类。这需要在定期加载课程之前发生!