我有 3 节课,说是:
A类、B类、C类
他们打包到 myClasses.jar
接下来我通过代码将 JAR 加载到 ClassLoader
Method 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);
}
我认为它必须起作用,但在日志中我得到了:
负载等级:A 类
无法加载等级:B 级
不能加载等级:classC
但是,不是每次!!!
如果我重新运行项目
我加载了classB,classA不是classC,另一次加载了classC,否则没有。
为什么?
类加载器是否需要时间来解析 JAR?或某事?