我有一个JAR文件,我需要得到这个JAR文件中所有类的名称。 我怎样才能做到这一点?
我GOOGLE了它,看到一些关于jar文件或Java ClassLoader
,但我不知道该怎么做。
我有一个JAR文件,我需要得到这个JAR文件中所有类的名称。 我怎样才能做到这一点?
我GOOGLE了它,看到一些关于jar文件或Java ClassLoader
,但我不知道该怎么做。
不幸的是,Java不提供一种简单的方法来列出“本土” JRE类。 这使得你有几个选项:(1)对于任何给定JAR文件,你可以列出JAR文件中的条目,找到.class
文件,然后确定哪些Java类各.class
文件表示; 或(b)可以使用,这是否对你的库。
在这个选项中,我们将填写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()));
}
}
番石榴不得不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);
您可以使用Java jar
工具。 列出jar文件的一个txt文件中的内容,你可以看到在罐子里的所有类。
jar tvf jarfile.jar
也许你正在寻找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
这是我使用的是黑客:
您可以使用java
的自动完成这样的:
java -cp path_to.jar <Tab>
这会给你可用通过为出发类类的列表。 当然,试图用一个没有主文件将不会做任何事,但你可以看到什么样java
认为里面的类.jar
被调用。
您可以使用
jar tf example.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列表归档文件(短格式)。 名称,未压缩的文件大小和修改日期和指定文件的时间打印,与合计为指定的所有文件一起。 如果解压缩用定义OS2_EAS编译,-l选项还列出了存储OS的尺寸/ 2扩展属性(EAS)和OS / 2的访问控制列表(ACL)的列。 此外,显示在压缩文件注释和个人文件的注释(如果有的话)。 如果一个文件是从一个单一的情况下的文件系统归档(例如,旧的MS-DOS FAT文件系统)和-L选项给出,文件名转换为小写和带有前缀插入符号(^)。
你可以试试:
jar tvf jarfile.jar
这将是唯一的,如果你的罐子是可执行的,即在明显有帮助你定义了一些类作为主类
你可以试试这个:
unzip -v /your/jar.jar
这将是唯一的,如果你的罐子是可执行的,即在明显有帮助你定义了一些类作为主类
方案说明:Eclipse IDE中可以通过创建一个Java项目中使用,这和添加所有罐子在项目构建路径
STEPS下面 :
创建一个样本Eclipse的Java项目。
所有的一切你的罐子在其构建路径
Ctrl + Shift + T,并输入完整的类名。
结果将显示在与具有类的所有罐子的窗口。 见附图。