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

时间:2015-04-26 10:52:45

标签: java linux class unix classloader

我已经在OpenJDK& amp;上的三台Windows机器和两台Linux VPS上测试了不同版本的Java。 Oracle JDK。它完美运行,然后突然之间,它只能在我的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)) {

我的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;
}
}

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

现在,这在过去一直运作良好,我不知道为什么它会停止。我会假设我打破了一些东西,但代码仍然在我的IDE中运行?

1 个答案:

答案 0 :(得分:0)

这似乎是你的错误:

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

您不是通过超级构造函数安装parent作为父类加载器。