我需要以编程方式计算给定jar文件中已编译类,接口和枚举的数量(因此我需要三个单独的数字)。哪个API对我有帮助?(我不能使用第三方库。)
我已经尝试过非常棘手的方案,这似乎并不总是正确的。即,我将每个ZipEntry读入byte
[],然后将结果提供给我的自定义类加载器,该加载器扩展了标准CalssLoader并将此byte
[]发送到ClassLoader.defineClass(这是受保护的,无法直接从应用程序代码中调用)。完整代码在Pastebin上。
jar文件是具有特定模式的zip文件。您可以使用ZipFile和ZipEntry或其子类JarFile和JarEntry。
此代码(自定义类加载器的方法)将返回一个Map,其中包含您需要的每种“类”类型的数组。
public Map<String, List<Class<?>>> loadAndScanJar(File jarFile)
throws ClassNotFoundException, ZipException, IOException {
// Load the jar file into the JVM
// You can remove this if the jar file already loaded.
super.addURL(jarFile.toURI().toURL());
Map<String, List<Class<?>>> classes = new HashMap<String, List<Class<?>>>();
List<Class<?>> interfaces = new ArrayList<Class<?>>();
List<Class<?>> clazzes = new ArrayList<Class<?>>();
List<Class<?>> enums = new ArrayList<Class<?>>();
List<Class<?>> annotations = new ArrayList<Class<?>>();
classes.put("interfaces", interfaces);
classes.put("classes", clazzes);
classes.put("annotations", annotations);
classes.put("enums", enums);
// Count the classes loaded
int count = 0;
// Your jar file
JarFile jar = new JarFile(jarFile);
// Getting the files into the jar
Enumeration<? extends JarEntry> enumeration = jar.entries();
// Iterates into the files in the jar file
while (enumeration.hasMoreElements()) {
ZipEntry zipEntry = enumeration.nextElement();
// Is this a class?
if (zipEntry.getName().endsWith(".class")) {
// Relative path of file into the jar.
String className = zipEntry.getName();
// Complete class name
className = className.replace(".class", "").replace("/", ".");
// Load class definition from JVM
Class<?> clazz = this.loadClass(className);
try {
// Verify the type of the "class"
if (clazz.isInterface()) {
interfaces.add(clazz);
} else if (clazz.isAnnotation()) {
annotations.add(clazz);
} else if (clazz.isEnum()) {
enums.add(clazz);
} else {
clazzes.add(clazz);
}
count++;
} catch (ClassCastException e) {
}
}
}
System.out.println("Total: " + count);
return classes;
}
问题内容: 我想编写一个程序(最好在Java中),以分析和分析Java堆转储文件(由jmap创建)。我知道已经有很多很棒的工具(jhat,eclipse的MAT等),但是我想从特定的角度分析应用程序中的堆。 在哪里可以阅读有关堆转储文件的结构,如何读取该文件的示例等?找不到有用的搜索内容… 非常感谢。 问题答案: 我不熟悉jhat,但是Eclipse的MAT是开源的。他们的SVN链接可用,也许您可
我想写一个程序(最好是在java中),它将解析和分析一个java堆转储文件(由jmap创建)。我知道有很多很棒的工具已经这样做了(jhat,eclipse的MAT,等等),但是我想从一个特定的角度来分析堆到我的应用程序。 我在哪里可以阅读堆转储文件的结构,示例如何阅读它,等等?没有找到任何有用的搜索... 非常感谢。
为了以编程方式分析。java文件,我刚刚开始玩Soot。从我所读到的内容来看,Soot似乎是一个非常强大的源代码分析工具,但我在网上找到的大多数材料都是将其用作命令行工具。 我需要以编程方式从给定目录中的。java文件加载类,构造程序依赖图(PDG)并进行一些程序切片。我仍然不确定是否Soot提供切片,但我可以实现自己一旦我有PDG。 为了开始,我尝试使用下面的代码: 然而,它不起作用。它在调用中
问题内容: 我有一个Java应用程序,它使用Apache Derby。使用Eclipse Export选项,将其导出为JAR文件。当我运行Eclipse并将服务器连接到端口1527时,JAR会正确执行。 但是,当在执行jar时关闭eclipse(并且服务器未连接到1527)时,出现此错误 java.sql.SQLNonTransientConnectionException:java.net.Co
问题内容: 我目前正在从事一个项目,该项目要求我以编程方式将.class文件反编译为Java文件。IE我有一个程序,应该读取一个类文件并对其进行反编译,并将生成的Java源代码写入文件中。请帮我做。 编辑:我是反编译器世界的全新手。我已经看过一些API,但是我不知道到底该如何使用以及使用哪个API。任何形式的帮助将是非常可观的 编辑: 我尝试使用: 但是上面的代码只是在指定的目录中创建了一个名为“
简短:给定(groupId,artifactId,version,repository URL),我可以用编程方式让Maven解析工件URL吗? Long:给定(groupId、artifactId、version、repository URL),可以下载一个Maven工件。工件的URL通常如下所示: 方案://{repository}/{groupId}/{artifactId}/{versio