Java ClassLoader不加载jar中的所有类

时间:2013-06-05 18:08:25

标签: java reflection

我有3个课,说是:

CLASSA,CLASSB,classC

他们打包到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);
            }

我认为它必须有效,但在日志中我得到了:

LOAD CLASS:classA

CANT LOAD CLASS:classB

CANT LOAD CLASS:classC

但是,不是每次都是!!!

如果我重新开始项目

我加载了classB,classA不是classC,另一个是classC加载,否则没有。

为什么?

类加载器是否需要时间来解析JAR?还是smth?

0 个答案:

没有答案