我有3个课,说是:
CLASSA,CLASSB,classC
他们打包到myClasses.jar
接下来,我通过代码
将JAR加载到ClassLoaderMethod method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[]{URL.class});
method.setAccessible(true);
method.invoke(retClassLoader, new Object[]{jarFile.toURI().toURL()});
之后我打开jar列出所有类并按代码获取它们
try {
ClassLoader classLoader = SMPBJars.loadExternalJar(jarFile);
System.out.println("CL:"+Class.class.getClassLoader()+"|"+Platform.class.getClassLoader()+"|"+classLoader);
JarInputStream jarFile;
jarFile = new JarInputStream(new FileInputStream(selectedFile));
JarEntry jarEntry;
while (true) {
jarEntry = jarFile.getNextJarEntry();
if (jarEntry == null) {
break;
}
String foundName = jarEntry.getName().replaceAll("/", "\\.");
if (foundName.contains(".class")) {
String correctClassName = foundName.replaceAll(".class", "");
Class<?> getClass;
try {
getClass = Class.forName(correctClassName);
System.out.println("LOAD CLASS:" + foundName);
}
} catch (ClassNotFoundException ex) {
System.out.println("CANT LOAD CLASS:" + foundName);
}
}
}
jarFile.close();
} catch (Exception ex) {
Logger.getLogger(SMPBSystemDirectoriesComponent.class.getName()).log(Level.SEVERE, null, ex);
}
我认为它必须有效,但在日志中我得到了:
LOAD CLASS:classA
CANT LOAD CLASS:classB
CANT LOAD CLASS:classC
但是,不是每次都是!!!
如果我重新开始项目
我加载了classB,classA不是classC,另一个是classC加载,否则没有。
为什么?
类加载器是否需要时间来解析JAR?还是smth?