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

Java Class.isAssignableFrom始终返回false。。。仅在IDE外部,java,linux,class,unix,classloader,Java,Linux,Class,Unix,Classloader,我在三台windows机器和两台linux VPSE上测试了不同版本的Java,都是在OpenJDK和Oracle JDK上。它功能完美,然后突然间,它只在我的IDE中工作,尽管我没有更改任何相关代码,我无法想象是什么导致了这种情况 系统中的通用代码: Class<?> cls = (session == null ? secjlcl : session.getJLCL()).loadClass(name); Logger.log(JavaLoader.class.isAssigna

我在三台windows机器和两台linux VPSE上测试了不同版本的Java,都是在OpenJDK和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)) {
Class cls=(session==null?secjlcl:session.getJLCL()).loadClass(name);
Logger.log(JavaLoader.class.isAssignableFrom(cls)+“-”+cls+“-”+cls.getSuperclass().getName());
if(JavaLoader.class.isAssignableFrom(cls)){
还有我的类加载器:

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;
}
}
公共类JavaLoaderClassLoader扩展URLClassLoader{
公共JavaLoaderClassLoader(URL[]URL,类加载器父级){
超级链接(url);
}
私有HashMap>();
公共字符串addClass(字节[]数据)抛出LinkageError{
类cls=defineClass(null,data,0,data.length);
put(cls.getName(),cls);
返回cls.getName();
}
公共类loadClass(字符串名称,布尔解析){
if(javaLoaders.containsKey(name))返回javaLoaders.get(name);
试一试{
类see=super.loadClass(名称、解析);
如果(see!=null)返回see;
}catch(classnotfounde异常){
Logger.logError(e);
}
返回null;
}
公共空间可丢弃{
super.finalize();
javaLoaders=null;
}
}
注意,我希望许多类加载器以相同的名称/包加载不同的文件,所以我使用单独的类加载器将它们分开,但是在测试中,没有进行测试


现在,这在过去工作得完美无缺,我不知道它为什么会停止。我假设我破坏了某些东西,但代码在我的IDE中仍然工作?

这似乎是您的错误:

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

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

您有多个类加载器。
System.out.println(cls.getClassLoader()+“”+JavaLoader.class.getClassLoader();
print-两个不同的东西,或者相同的东西两次?@immibis在非IDE环境中,我加载的一个是我的自定义类加载器,另一个是标准的URLClassLoader。但是,在我的IDE中,它使用sun.misc.Launcher的AppClassLoader。这似乎说明了问题,我可以使用父类加载器,或者加载我的JavaLoad用我的类加载器创建一个JAR类。我会调查一下。你运行的JAR中是否有其他JAR?例如,在Eclipse中,你导出一个可运行的JAR并选择“将所需的库打包到生成的JAR中”?如果是这样,那么查看Eclipse的JAR-in-JAR类加载器,它正在设置自己的默认StreamHandlerFactory。另一个问题可能是类的搜索顺序。您是否在某个托管环境中运行(例如Servlet容器,或者某个EJB容器)?