2015-04-26 14 views
6

Przetestowałem na trzech komputerach z systemem Windows i dwóch serwerach VPS na różnych wersjach Javy, zarówno na JJK Oracle OpenJDK &. Działał idealnie, a potem nagle działa tylko w moim IDE, chociaż nie zmieniłem żadnego istotnego kodu i nie mogę sobie wyobrazić, co może to spowodować.Java Class.isAssignableFROM ZAWSZE zwraca false ... tylko poza IDE

Rozpowszechnione kod w systemie:

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

A moja 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; 
} 
} 

Jedna uwaga, spodziewam się wiele classloaders załadować inny plik w tej samej nazwie/opakowaniu, więc używam oddzielnego classloaders, aby zachować je oddzielnie, jednak w testowaniu NIE było to testowane.

Teraz działało bez zarzutu w przeszłości i nie mam pojęcia, dlaczego przestało. Zakładam, że coś zepsułem, ale kod nadal działa w moim IDE?

+2

Masz wiele programów ładujących klasy. Co to jest 'System.out.println (cls.getClassLoader() +" "+ JavaLoader.class.getClassLoader());' print - dwie różne rzeczy, lub te same rzeczy dwa razy? – immibis

+0

@immibis W środowiskach innych niż IDE, mój załadowany jest moim niestandardowym ClassLoader, a jeden jest standardowym URLClassLoader. Jednak w moim IDE używa AppClassLoader z sun.misc.Launcher. Wydaje się to wskazywać na problem, mógłbym użyć nadrzędnego programu ładującego klasy jako mojego, LUB załadować moją klasę JavaLoader za pomocą mojego programu ładującego klasy. Zbadam. – JavaProphet

+0

Czy używasz pliku JAR, który zawiera inne pliki JAR? Np. W Eclipse eksportujesz działający plik JAR i wybierasz "Pakiety wymagane biblioteki w wygenerowanym pliku JAR"? Jeśli tak, to spójrz na program ładujący klasy JAR-in-JAR Eclipse, który ustawia własny domyślny StreamHandlerFactory. Drugą kwestią może być kolejność przeszukiwania klas. – Dan

Odpowiedz

0

Wydaje się to być twój błąd:

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

nie instalujesz parent jako ładowarki klasy macierzystej przez super konstruktora.

Powiązane problemy