2

我有 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?或某事?

4

0 回答 0