我正在试验 ASM 库。
我有一个存储为 的类byte[]
,即以 CAFEBABE 开头,带有常量池等。
我想以尽可能方便的方式加载这个类并提取一个字段,因为这个过程将被添加到 ASM 的方法中。
有没有一种简单的方法可以将字节数组作为类加载而不会弄乱自定义类加载器等?
我正在试验 ASM 库。
我有一个存储为 的类byte[]
,即以 CAFEBABE 开头,带有常量池等。
我想以尽可能方便的方式加载这个类并提取一个字段,因为这个过程将被添加到 ASM 的方法中。
有没有一种简单的方法可以将字节数组作为类加载而不会弄乱自定义类加载器等?
编辑:误读了这个问题。您想从字面上加载课程吗?
static class BLoader extends ClassLoader {
public BLoader(ClassLoader parent) {
super(parent);
}
public Class<?> get(String name, byte[] bytes) {
return defineClass(name, bytes, 0, bytes.length);
}
}
使用者:
Class<?> clazz = new BLoader(ClassLoader.getSystemClassLoader()).get("ClassName", cw.toByteArray());
我们使用自定义 ClassLoader 因为我们需要一个公共的 defineClass() 方法。所以你所要做的就是字面上的这个。
public class GenericClassLoader extends ClassLoader {
public Class<?> defineClass(String name, byte[] b) {
return defineClass(name, b, 0, b.length);
}
}
并加载类。
GenericClassLoader classLoader = new GenericClassLoader();
Class<?> clazz = cl.defineClass("class name", classWriter.toByteArray());
如果你有一个 ClassNode 并且想根据类名生成类,你可以使用 classNode.name,像这样。
Class<?> clazz = classLoader.defineClass(cn.name, classWriter.toByteArray());