【问题标题】:Listing classes in a jar file列出 jar 文件中的类
【发布时间】:2011-03-26 15:35:10
【问题描述】:

如何动态加载 jar 文件并列出其中的类?

【问题讨论】:

  • 对于像我这样的人,因为试图找出如何在 命令行 中列出 jar 中的类而不是通过 Java,所以找到了这个页面,答案是 jar tf yourfile.jar
  • @Hnatt 或任何像 7-zip 这样的 zip 阅读器都可以工作(对于 Windows),甚至 unzip -l yourfile.jar 对于 *nix。

标签: java class dynamic urlclassloader


【解决方案1】:

这是列出 jar 中的类的代码:

import java.io.IOException;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class JarList {
    public static void main(String args[]) throws IOException {

        if (args.length > 0) {
            JarFile jarFile = new JarFile(args[0]);
            Enumeration allEntries = jarFile.entries();
            while (allEntries.hasMoreElements()) {
                JarEntry entry = (JarEntry) allEntries.nextElement();
                String name = entry.getName();
                System.out.println(name);
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    您可以使用以下命令从命令提示符查看 JAR 文件的内容:

    jar tf jar-file
    

    例如:

    jar tf TicTacToe.jar
    
    
    META-INF/MANIFEST.MF  
    TicTacToe.class  
    audio/  
    audio/beep.au  
    audio/ding.au  
    audio/return.au  
    audio/yahoo1.au  
    audio/yahoo2.au  
    images/  
    images/cross.gif  
    images/not.gif  
    

    【讨论】:

      【解决方案3】:

      查看包java.util.jar 中的类。您可以在网上找到如何列出 JAR 中的文件的示例,这里是 an example。 (另请注意该页面底部的链接,还有更多示例向您展示如何使用 JAR 文件)。

      【讨论】:

      • 非常感谢,“.class”文件是classes吗?如何将 .class 文件加载为类?
      • 那么您想从 JAR 文件中动态加载类吗?这比你最初要求的要多得多。也许这个问题包含一些答案:stackoverflow.com/questions/194698/…
      【解决方案4】:

      快速方法:只需将 .jar 作为 .zip 打开即可,例如在 7-Zip 中查找目录名称。

      【讨论】:

      • 如果您的工作站上没有jar 命令并且不想安装它只是为了进行这一检查,这会非常有效
      【解决方案5】:

      这是一个扫描给定 jar 以查找所有扩展特定类的非抽象类的版本:

      try (JarFile jf = new JarFile("/path/to/file.jar")) {
          for (Enumeration<JarEntry> en = jf.entries(); en.hasMoreElements(); ) {
              JarEntry e = en.nextElement();
              String name = e.getName();
              // Check for package or sub-package (you can change the test for *exact* package here)
              if (name.startsWith("my/specific/package/") && name.endsWith(".class")) {
                  // Strip out ".class" and reformat path to package name
                  String javaName = name.substring(0, name.lastIndexOf('.')).replace('/', '.');
                  System.out.print("Checking "+javaName+" ... ");
                  Class<?> cls;
                  try {
                      cls = Class.forName(javaName);
                  } catch (ClassNotFoundException ex)  { // E.g. internal classes, ...
                      continue;
                  }
                  if ((cls.getModifiers() & Modifier.ABSTRACT) != 0) { // Only instanciable classes
                      System.out.println("(abstract)");
                      continue;
                  }
                  if (!TheSuper.class.isAssignableFrom(cls)) { // Only subclasses of "TheSuper" class
                      System.out.println("(not TheSuper)");
                      continue;
                  }
                  // Found!
                  System.out.println("OK");
              }
          }
      } catch (IOException e) {
          e.printStackTrace();
      }
      

      当您知道 jar 在哪里时,您可以直接使用该代码。要获取该信息,请参阅 this other question,因为自 Java 9 和引入模块以来,通过类路径发生了变化。

      【讨论】:

        猜你喜欢
        • 2010-11-28
        • 2016-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-25
        • 1970-01-01
        • 2010-12-16
        • 1970-01-01
        相关资源
        最近更新 更多