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?
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
@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
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