如何获得一个jar文件中的类名?(How to get names of classes insid

2019-08-18 07:51发布

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

我GOOGLE了它,看到一些关于jar文件或Java ClassLoader ,但我不知道该怎么做。

Answer 1:

不幸的是,Java不提供一种简单的方法来列出“本土” JRE类。 这使得你有几个选项:(1)对于任何给定JAR文件,你可以列出JAR文件中的条目,找到.class文件,然后确定哪些Java类各.class文件表示; 或(b)可以使用,这是否对你的库。

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

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

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):使用专门的反射库

番石榴

番石榴不得不ClassPath ,因为至少14.0,这是我使用和喜欢。 约一个好处ClassPath是,它不会加载它找到的类,当你扫描了大量的类这是非常重要的。

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

思考

我没有亲自使用该反思库 ,但似乎很受欢迎。 提供的网站像这样快捷的方式加载任何 JAR文件,这也可能是您的应用程序非常有用提供了包中的所有类上的一些很好的例子。

Reflections reflections = new Reflections("my.project.prefix");

Set<Class<? extends SomeType>> subTypes = reflections.getSubTypesOf(SomeType.class);

Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);


Answer 2:

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

jar tvf jarfile.jar


Answer 3:

也许你正在寻找jar命令来获取在终端的类别列表,

$ 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的ES,

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


Answer 4:

这是我使用的是黑客:

您可以使用java的自动完成这样的:

java -cp path_to.jar <Tab>

这会给你可用通过为出发类类的列表。 当然,试图用一个没有主文件将不会做任何事,但你可以看到什么样java认为里面的类.jar被调用。



Answer 5:

您可以使用

jar tf example.jar


Answer 6:

以下命令将列出一个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列表归档文件(短格式)。 名称,未压缩的文件大小和修改日期和指定文件的时间打印,与合计为指定的所有文件一起。 如果解压缩用定义OS2_EAS编译,-l选项还列出了存储OS的尺寸/ 2扩展属性(EAS)和OS / 2的访问控制列表(ACL)的列。 此外,显示在压缩文件注释和个人文件的注释(如果有的话)。 如果一个文件是从一个单一的情况下的文件系统归档(例如,旧的MS-DOS FAT文件系统)和-L选项给出,文件名转换为小写和带有前缀插入符号(^)。



Answer 7:

你可以试试:

jar tvf jarfile.jar 

这将是唯一的,如果你的罐子是可执行的,即在明显有帮助你定义了一些类作为主类



Answer 8:

你可以试试这个:

unzip -v /your/jar.jar

这将是唯一的,如果你的罐子是可执行的,即在明显有帮助你定义了一些类作为主类



Answer 9:

方案说明:Eclipse IDE中可以通过创建一个Java项目中使用,这和添加所有罐子在项目构建路径

STEPS下面

  1. 创建一个样本Eclipse的Java项目。

  2. 所有的一切你的罐子在其构建路径

  3. Ctrl + Shift + T,并输入完整的类名。

  4. 结果将显示在与具有类的所有罐子的窗口。 见附图。



文章来源: How to get names of classes inside a jar file?