以编程方式分析jar文件

我需要以编程方式计算给定jar文件中编译的类,接口和枚举的数量(所以我需要三个单独的数字)。 哪种API对我有帮助? (我不能使用第三方库。)

我已经尝试了相当棘手的方案,似乎并不总是正确的。 也就是说,我将每个ZipEntry读入一个byte [],然后将结果提供给我的自定义类加载器,它扩展了标准的CalssLoader,并将此byte []发送到ClassLoader.defineClass(这是保护,无法直接从应用程序代码调用) )。 完整代码在Pastebin上 。

jar文件是具有特定模式的zip文件。 您可以使用ZipFile和ZipEntry或他们的子类JarFile和JarEntry。

此代码(自定义类加载器的方法)将返回一个Map,其中包含您需要的每种类型“类”的数组。

 public Map>> loadAndScanJar(File jarFile) throws ClassNotFoundException, ZipException, IOException { // Load the jar file into the JVM // You can remove this if the jar file already loaded. super.addURL(jarFile.toURI().toURL()); Map>> classes = new HashMap>>(); List> interfaces = new ArrayList>(); List> clazzes = new ArrayList>(); List> enums = new ArrayList>(); List> annotations = new ArrayList>(); classes.put("interfaces", interfaces); classes.put("classes", clazzes); classes.put("annotations", annotations); classes.put("enums", enums); // Count the classes loaded int count = 0; // Your jar file JarFile jar = new JarFile(jarFile); // Getting the files into the jar Enumeration enumeration = jar.entries(); // Iterates into the files in the jar file while (enumeration.hasMoreElements()) { ZipEntry zipEntry = enumeration.nextElement(); // Is this a class? if (zipEntry.getName().endsWith(".class")) { // Relative path of file into the jar. String className = zipEntry.getName(); // Complete class name className = className.replace(".class", "").replace("/", "."); // Load class definition from JVM Class clazz = this.loadClass(className); try { // Verify the type of the "class" if (clazz.isInterface()) { interfaces.add(clazz); } else if (clazz.isAnnotation()) { annotations.add(clazz); } else if (clazz.isEnum()) { enums.add(clazz); } else { clazzes.add(clazz); } count++; } catch (ClassCastException e) { } } } System.out.println("Total: " + count); return classes; }