我的自定义Java ClassLoader会加载一个类,但是clazz.getClassLoader()是myClassLoader.getParent(),而不是myClassLoader

问题描述 投票:0回答:1

我有一个类加载器,看起来像这样:

@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加载。如果那不是什么工作原理,那么它如何工作?而我该怎么做呢?

java classloader
1个回答
0
投票
事实是我没有使用自定义ClassLoader,但是据我了解,在这些ClassLoader对象的层次上,它们是通过父/子关系相互关联的。这意味着,当ClassLoader打算加载一个类时,它首先询问其父ClassLoader是否可用,在这种情况下,它将加载它。如果父类ClassLoader无法加载它,则将请求委托给下一个父类,直到到达BootStrapClassLoader。如果父ClassLoader都无法加载该类,则当前的类加载器将尝试从其可用路由中加载它。找不到它会导致ClassNotFoundException。

我希望这些链接可以为您提供帮助:baeldungjavaworld

© www.soinside.com 2019 - 2024. All rights reserved.