在jar中动态列出类

时间:2017-11-13 19:17:44

标签: java

好的,所以我有这个jar文件 我想要检索那个jar里面的所有类。

我已经看到了其他一些问题,但是,大多数都需要类名或包名。

我想要一些不需要的东西。也许是一个请求文件路径“example.jar”的方法,然后它返回一个包含各种类名的列表。

顺便说一下,如果类名是正确的术语,我现在不是真的,我需要的是这样的“com.name.name1”。

我会使用反射从jar中检索到的字符串。 结果是动态加载jar而不需要任何类名。

2 个答案:

答案 0 :(得分:1)

jar文件基本上只是一个zip文件。您可以使用ZipInputStream打开它并扫描内容。名称以".class"结尾的任何文件都应该是一个类,您可以相当容易地重建包名称等。

或者,如果您想了解有关这些类的更多信息,您应该使用一个为您处理类解析的库(如this one) - 它相对复杂。

答案 1 :(得分:0)

您可以使用JarFile#entries获取ZIP文件条目的枚举,而不是使用URLClassLoader来获取类:

private List<Class<?>> loadClasses(String pathToJar){

   ArrayList<Class<?>> classes = new ArrayList<Class<?>>();
            JarFile jarFile = null;
            try {
                jarFile = new JarFile(pathToJar);
                Enumeration<JarEntry> e = jarFile.entries();
                URL[] urls = { new URL("jar:file:" + pathToJar+"!/") };
                URLClassLoader cl = URLClassLoader.newInstance(urls);
                while (e.hasMoreElements()) {
                 JarEntry je = e.nextElement();

                 if(je.isDirectory() || !je.getName().endsWith(".class")){
                   continue;
                 }
                 String className = je.getName().substring(0,je.getName().length()-String.valueOf(".class").length());
                 className = className.replace('/', '.');
                 Class<?> clazz = cl.loadClass(className);
                 classes.add(clazz);
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            } catch (ClassNotFoundException e1) {
                e1.printStackTrace();
            }finally {
                try {
                    jarFile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    return classes.isEmpty() ? null : classes;
}