当前位置: 首页 > 面试题库 >

以编程方式分析jar文件

叶裕
2023-03-14
问题内容

我需要以编程方式计算给定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