如何通过Package.getPackage(...)访问包?

时间:2013-07-07 19:57:52

标签: java reflection package classloader

在我目前的项目中,我想将一些配置数据存储在一个包注释中,并由一些CDI生产者访问它。如果在当前包中找不到注释,则生产者将在包层次结构中向上搜索它。

到目前为止一切顺利。不幸的是,只有在第一次访问其中一个类或接口之后,我才能通过Package.getPackage("my.package")访问现有的包。

以下示例说明了此行为:

包中的类a.b

package a.b;

public class ClassInMitte {
}

访问包oben.mitte

的示例程序
package other;

public class Refl {
    public static void main(String[] args)
    {
        Package viaName = Package.getPackage("a.b");

        System.out.println(viaName.getName());
        System.out.println(viaName.hashCode());
    }
}

运行Refl会产生NullPointerException但是如果我添加new ClassInMitte()作为第一个语句,我可以访问包信息。在我可以访问包信息本身之前,我必须以某种方式访问​​包的内容。这是有道理的,否则类加载器必须在启动时扫描整个类路径。

但是netherless是否有一种简单的方法来访问包信息而无需访问包的内容?我知道我可以使用像reflections这样的框架,但是“轻量级”解决方案将是我首选的解决方案。

1 个答案:

答案 0 :(得分:1)

Package.getPackage只返回当前类加载器已知的包,唯一的方法是从该包中加载一个类。它基本上是ClassLoader.getPackage的包装器。