我正在试验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());