Java Class.isAssignableFrom始终返回false ...仅在IDE外部

Jav*_*het 6 java unix linux class classloader

我在OpenJDK和Oracle JDK上测试了不同版本Java上的三台Windows机器和两台Linux VPS.它完美运行,然后突然之间,它只在我的IDE中工作,虽然我没有改变任何相关的代码,我无法想象是什么导致这一点.

系统中的普遍代码:

Class<?> cls = (session == null ? secjlcl : session.getJLCL()).loadClass(name);
Logger.log(JavaLoader.class.isAssignableFrom(cls) + " - " + cls + " - " + cls.getSuperclass().getName());
if (JavaLoader.class.isAssignableFrom(cls)) {
Run Code Online (Sandbox Code Playgroud)

我的ClassLoader:

public class JavaLoaderClassLoader extends URLClassLoader {
public JavaLoaderClassLoader(URL[] url, ClassLoader parent) {
    super(url);
}

private HashMap<String, Class<?>> javaLoaders = new HashMap<String, Class<?>>();

public String addClass(byte[] data) throws LinkageError {
    Class<?> cls = defineClass(null, data, 0, data.length);
    javaLoaders.put(cls.getName(), cls);
    return cls.getName();
}

public Class<?> loadClass(String name, boolean resolve) {
    if (javaLoaders.containsKey(name)) return javaLoaders.get(name);
    try {
        Class<?> see = super.loadClass(name, resolve);
        if (see != null) return see;
    }catch (ClassNotFoundException e) {
        Logger.logError(e);
    }
    return null;
}

public void finalize() throws Throwable {
    super.finalize();
    javaLoaders = null;
}
}
Run Code Online (Sandbox Code Playgroud)

一个注意事项,我希望许多类加载器在同一名称/包中加载不同的文件,因此我使用单独的类加载器将它们分开,但是在测试中,未经过测试.

现在,这在过去完美无缺,我不知道为什么它会停止.我会假设我破坏了一些东西,但代码仍在我的IDE中运行?

Tom*_*ine 1

这似乎是你的错误:

public JavaLoaderClassLoader(URL[] url, ClassLoader parent) {
    super(url);
}
Run Code Online (Sandbox Code Playgroud)

您没有parent通过超级构造函数安装为父类加载器。