2015-04-26 8 views
6

Ho testato su tre macchine Windows e due VPS di Linux, su diverse versioni di Java, sia su OpenJDK & Oracle JDK. Funzionava perfettamente, e poi all'improvviso, funziona solo nel mio IDE, anche se non ho cambiato alcun codice rilevante, e non riesco a immaginare cosa possa causare questo.Java Class.isAssignableFrom restituisce false ... solo all'esterno IDE

codice prevalente nel sistema:

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

E il mio 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; 
} 
} 

Una nota, mi aspetto molti classloader di caricare un file diverso con lo stesso nome/package, per cui uso separato i classloader per tenerli separati, tuttavia in fase di test, NON sono stati testati.

Ora, questo ha funzionato perfettamente in passato, e non ho idea del perché si sia fermato. Direi che ho rotto qualcosa, ma il codice funziona ancora nel mio IDE?

+2

Hai più caricatori di classe. Cosa significa 'System.out.println (cls.getClassLoader() +" "+ JavaLoader.class.getClassLoader());' stampa - due cose diverse o le stesse cose due volte? – immibis

+0

@immibis Su ambienti non IDE, il mio caricato è il mio ClassLoader personalizzato e uno è lo standard URLClassLoader. Tuttavia, nel mio IDE, utilizza AppClassLoader da sun.misc.Launcher. Questo sembra mostrare il problema, potrei usare il classloader genitore per il mio come quello, OPPURE caricare la mia classe JavaLoader con il mio classloader. Indagherò – JavaProphet

+0

Stai eseguendo un JAR con altri JAR al suo interno? Ad esempio, in Eclipse si esporta un JAR eseguibile e si seleziona "Pacchetti librerie richieste nel JAR generato"? In tal caso, esaminare il classloader JAR-in-JAR di Eclipse che imposta il proprio streamHandlerFactory predefinito. L'altro problema potrebbe essere l'ordine in cui vengono cercate le classi. – Dan

risposta

0

Questo sembra essere il bug:

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

Non sta installando parent come il caricatore di classe padre attraverso il costruttore eccellente.