2015-04-26 6 views
6

Ich habe auf drei Windows-Maschinen und zwei Linux-VPSes, auf verschiedenen Versionen von Java, beide auf dem OpenJDK & Oracle JDK getestet. Es funktionierte perfekt und plötzlich funktioniert es nur in meiner IDE, obwohl ich keinen relevanten Code geändert habe, und ich kann mir nicht vorstellen, was das verursachen kann.Java Class.isAssignableFrom IMMER Rückkehr false ... nur außerhalb IDE

Prevalent Code im System:

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

Und mein 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; 
} 
} 

Eine Anmerkung, ich erwarte, dass viele Classloader eine andere Datei in dem gleichen Namen/Paket laden, so dass ich getrennt Classloader, um sie getrennt zu halten, aber im Test wurde das NICHT getestet.

Jetzt hatte dies in der Vergangenheit einwandfrei funktioniert, und ich habe keine Ahnung, warum es aufgehört hat. Ich würde annehmen, dass ich etwas kaputt gemacht habe, aber der Code funktioniert immer noch in meiner IDE?

+2

Sie haben mehrere Klassenlader. Was bedeutet 'System.out.println (cls.getClassLoader() +" "+ JavaLoader.class.getClassLoader());' print - zwei verschiedene Dinge, oder die gleichen Dinge zweimal? – immibis

+0

@immibis In Nicht-IDE-Umgebungen ist meine geladene Version mein benutzerdefinierter ClassLoader, und eine davon ist der Standard-URLClassLoader. In meiner IDE verwendet es jedoch AppClassLoader von sun.misc.Launcher. Das scheint das Problem zu zeigen, ich könnte den Eltern-Classloader für meinen verwenden, ODER meine JavaLoader-Klasse mit meinem Classloader laden. Ich werde nachforschen. – JavaProphet

+0

Betreiben Sie eine JAR, die andere JARs enthält? ZB in Eclipse exportieren Sie eine ausführbare JAR und wählen Sie "Pakete benötigt Bibliotheken in generierten JAR"? Wenn ja, dann schauen Sie sich den JAR-in-JAR Classloader von Eclipse an, der seine eigene Standard-StreamHandlerFactory einstellt. Das andere Problem könnte die Reihenfolge sein, in der Klassen durchsucht werden. – Dan

Antwort

0

Dies scheint Ihr Fehler zu sein:

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

Sie sind nicht parent als Mutter Class-Loader über das Super-Konstruktor installieren.

Verwandte Themen