我有一个类加载器,看起来像这样:
@Override
public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
if(isExcluded(name)) return super.loadClass(name, resolve);
// irrelevant... it always returns above
InputStream s = getResourceAsStream(name.replace('.', '/') + ".class");
if(s == null) throw new ClassNotFoundException(name);
ClassReader reader;
try {
reader = new ClassReader(s);
} catch(IOException e) {
throw new RuntimeException(e);
}
ClassWriter writer = new ClassWriter(Opcodes.ASM4);
ClassVisitor v = new RemappingClassAdapter(writer, remapper);
reader.accept(v, 0);
byte[] bytes = writer.toByteArray();
Class<?> c = defineClass(name, bytes, 0, bytes.length);
if(resolve) {
resolveClass(c);
}
return c;
}
然后我做
MyClassLoader loader = new MyClassLoader(Main.class.getClassLoader());
Class<?> c = loader.loadClass(className, true); // also tried false, and loader.loadClass(className)
c.getClassLoader(); // AppClassLoader instead of MyClassLoader, why?
Method m = c.getDeclaredMethod(methodName);
return m.invoke(c.newInstance());
不是由类加载器加载的类,是不是类加载器是那个类加载器?我想要这样做的原因是,这样我正在加载的任何此类引用的类(className
),我也希望它也可以由MyClassLoader加载。如果那不是什么工作原理,那么它如何工作?而我该怎么做呢?