如何获取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,我已经使用和喜欢的ClassPath
。 ClassPath
一个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