如何获取jar文件中的类名称?

我有一个JAR文件,我需要得到这个JAR文件中所有类的名字。 我怎样才能做到这一点?

我GOOGLE了一下,看到了一些关于JarFile或Java ClassLoader但我不知道如何做到这一点。

不幸的是,Java并没有提供一个简单的方法来列出“原生”JRE中的类。 这留下了一些select:(a)对于任何给定的JAR文件,可以列出该JAR文件中的条目,find.class文件,然后确定每个.class文件代表哪个Java类; 或者(b)你可以使用一个为你做这个的库。

选项(a):手动扫描JAR文件

在这个选项中,我们将使用/path/to/jar/file.jar的jar文件中包含的所有Java类的列表填充classNames

 List<String> classNames = new ArrayList<String>(); ZipInputStream zip = new ZipInputStream(new FileInputStream("/path/to/jar/file.jar")); for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry()) { if (!entry.isDirectory() && entry.getName().endsWith(".class")) { // This ZipEntry represents a class. Now, what class does it represent? String className = entry.getName().replace('/', '.'); // including ".class" classNames.add(className.substring(0, className.length() - ".class".length())); } } 

选项(b):使用专门的reflection库

番石榴

番石榴已经有至less14.0,我已经使用和喜欢的ClassPathClassPath一个ClassPath就是它不会加载它find的类,这在扫描大量类时非常重要。

 ClassPath cp=ClassPath.from(Thread.currentThread().getContextClassLoader()); for(ClassPath.ClassInfo info : cp.getTopLevelClassesRecurusive("my.package.name")) { // Do stuff with classes here... } 

思考

我没有亲自使用reflection库 ,但似乎很受欢迎。 在网站上提供了一些很好的例子,就像这个快速的方法来加载任何 JAR文件提供的包中的所有类,这对您的应用程序也是有用的。

 Reflections reflections = new Reflections("my.project.prefix"); Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class); Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class); 

你可以使用Java jar工具。 列出一个txt文件中的jar文件的内容,你可以看到jar中的所有类。

 jar tvf jarfile.jar 

也许你正在寻找jar命令来获取terminal中的类的列表,

 $ jar tf ~/.m2/repository/org/apache/spark/spark-assembly/1.2.0-SNAPSHOT/spark-assembly-1.2.0-SNAPSHOT-hadoop1.0.4.jar META-INF/ META-INF/MANIFEST.MF org/ org/apache/ org/apache/spark/ org/apache/spark/unused/ org/apache/spark/unused/UnusedStubClass.class META-INF/maven/ META-INF/maven/org.spark-project.spark/ META-INF/maven/org.spark-project.spark/unused/ META-INF/maven/org.spark-project.spark/unused/pom.xml META-INF/maven/org.spark-project.spark/unused/pom.properties META-INF/NOTICE 

哪里,

 -t list table of contents for archive -f specify archive file name 

或者,只要grep以上的结果只看到.class es

 $ jar tf ~/.m2/repository/org/apache/spark/spark-assembly/1.2.0-SNAPSHOT/spark-assembly-1.2.0-SNAPSHOT-hadoop1.0.4.jar | grep .class org/apache/spark/unused/UnusedStubClass.class 

要查看class数量,

 jar tvf launcher/target/usergrid-launcher-1.0-SNAPSHOT.jar | grep .class | wc -l 61079 

这是我正在使用的黑客:

你可以像这样使用java的自动完成function:

 java -cp path_to.jar <Tab> 

这会给你一个可以通过的类作为起始类的列表。 当然,试图使用没有主文件的文件将不会执行任何操作,但是您可以看到java认为.jar中的类是否被调用。

下面的命令将列出一个jar文件的内容。

命令: – unzip -l jarfilename.jar

样本o / p: –

Archive: hello-world.jar Length Date Time Name --------- ---------- ----- ---- 43161 10-18-2017 15:44 hello-world/com/ami/so/search/So.class 20531 10-18-2017 15:44 hello-world/com/ami/so/util/SoUtil.class --------- ------- 63692 2 files

根据unzip手册

-l列出归档文件(短格式)。 打印指定文件的名称,未压缩的文件大小和修改date和时间以及指定的所有文件的总计。 如果UnZip是使用定义的OS2_EAS编译的,则-l选项还会列出存储的OS / 2扩展属性(EA)和OS / 2访问控制列表(ACL)大小的列。 另外还显示zipfile注释和个别文件注释(如果有的话)。 如果从单个文件系统(例如,旧的MS-DOS FAT文件系统)归档文件并且给出了-L选项,则文件名将转换为小写字母,并带有插入符号(^)的前缀。

你可以试试:

 jar tvf jarfile.jar 

这只有在你的jar是可执行文件的时候才有帮助,例如,在你已经定义了一些类作为主类的清单中

你可以试试这个:

 unzip -v /your/jar.jar 

这只有在你的jar是可执行文件的时候才有帮助,例如,在你已经定义了一些类作为主类的清单中

你可以使用

 jar tf example.jar