我试图在运行时从字节数组加载一个类。 它工作正常,自定义类加载器返回一个具有正确名称的有效类对象。我可以使用类对象,我可以通过反射使用该类。
我的问题是,如果我尝试直接使用该类,它仍然会抛出ClassNotFoundException
。所以我的问题是,如何加载一个我可以直接使用它的类?
自定义ClassLoader
将是关于加载库的,所以我直接引用类
我的代码:
public class ByteClassLoader extends ClassLoader {
private final HashMap<String, byte[]> classBytes;
public ByteClassLoader(final ClassLoader loader, HashMap<String, byte[]> classes) {
super(loader);
classBytes = classes;
}
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
final byte[] arr = classBytes.remove(name);
if (arr != null)
return defineClass(name, arr, 0, arr.length);
return super.findClass(name);
}
public static void main(String[] args) throws Exception {
final HashMap<String, byte[]> map = new HashMap<>();
// Load class file
final byte[] data = Files.readAllBytes(
new File("/Users/Florian/Desktop/AC.class").toPath()
);
map.put("dyn.AC", data);
// Create new Custom classloader
final ByteClassLoader loader = new ByteClassLoader(
Thread.currentThread().getContextClassLoader(), map
);
// Set context class loader
Thread.currentThread().setContextClassLoader(loader);
// Loading the class
Class<?> acc = loader.findClass("dyn.AC");
// Works. -_-
acc.getMethod("trigger").invoke(null);
// Works
System.out.println(acc.getName());
// Test method, only contains System.out method, DOESNT WORK
AC.trigger();
}
}
AC的内容:http://paste.reflex.rip/umecoruwer.cs
Stacktrace:http://paste.reflex.rip/exezividuz.swift