gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:50:03 24 4
gpt4 key购买 nike

我已经花了一段时间来研究以下问题的解决方案。假设我有以下 Java 代码:

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

编译此代码的结果是一个类文件A.class,其中包含Java字节代码。我编写了一个 ClassLoader,它加载 A.class 并执行 start()。我的意图是将加载的 A.class (字节代码)new ArrayList() 替换为 MyArrayList():

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

MyArrayList的定义类似于:class MyArrayList extends ArrayList

最佳答案

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

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

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

关于java - 在 Java 字节码中替换实例的(类)类型的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23906885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com