【问题标题】:How to know the classes of a package in java? [duplicate]如何知道java中包的类? [复制]
【发布时间】:2011-02-13 01:54:57
【问题描述】:

可能重复:
Can you find all classes in a package using reflection?

假设我有一个包名作为字符串:

String pkgName = "com.forat.web.servlets";

如何知道这个包中的类型?

【问题讨论】:

标签: java reflection


【解决方案1】:

这是不可能的。如果您的类存储在目录或 JAR 文件中,您可以查看其内容,但类加载器机制非常灵活,以至于“这个包中有哪些类”的问题根本没有意义——可以编写一个类加载器为您要求的任何类名返回一个类。

【讨论】:

  • 哦,拜托,确实有道理,即使不可能总是回答问题。
【解决方案2】:

能否提供更多细节,比如什么样的环境?一个独立的应用程序,一个应用程序服务器中的 webapp。类从哪里加载? JAR、文件系统上的单独文件、网络类加载器等。

没有简单的答案,只是因为没有简单的包定义。一个包可以分布在多个 jars、多个类加载器上,并且在网络类加载器的情况下,这些类存在于另一台机器上。

最后,您是只想考虑加载到 VM 中的类还是类路径中存在的所有类?

编辑:另见related question.

【讨论】:

    【解决方案3】:

    这两个答案解释了应该涵盖许多实际问题的方法:

    【讨论】:

      【解决方案4】:

      如果您有一个想要从中获取 .class 文件的 .jar 文件,可以使用以下命令:

      • java.util.jar.JarEntry

      • java.net.JarURLConnection 通过java.​net.​URL 创建。

      • 本例中的URL是本例中的包名:com.forat.web.servlets

      示例

      (注意:忽略异常处理)

      // Get the "things" that are in the .jar
      Enumeration<JarEntry> jarEntries = 
          ((JarURLConnection)urlToJar.openConnection()).getJarFile().entries();
      while(jarEntries.hasMoreElements())
      {
          String entry = jarEntries.nextElement().getName();
      
          if (entry.endsWith(".class"))
          {
              // TODO: Remove "." from result.
          // Here is the first of the classes in the .servlets location
              Class.forName(entry);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-08
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 2014-06-23
        • 1970-01-01
        • 2016-11-30
        相关资源
        最近更新 更多