如何知道java中包的类?

时间:2010-04-27 20:53:14

标签: java reflection

  

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

假设我的包名是字符串:

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

如何知道此包中的类型?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

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

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

编辑:另见related question.

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您有一个.jar文件,您希望从中获取.class文件,可以使用以下内容:

  • java.util.jar.JarEntry

  • java.net.JarURLConnection通过java.​net.​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);
    }
}