有没有办法强制类装入器装入包,即使其类都未装入?

2022-09-03 06:02:40

假设一个java代码库有一个名为“com.example”的包。

在运行时,我们可以通过调用

Package p = Package.getPackage( "com.example" ); //(returns null)

甚至通过调用获取所有软件包的列表

Packages[] ps = Package.getPackages();

问题是 - 如果 ClassLoader 尚未从包中加载任何类,则这些函数调用将不可用。我们可以通过先强制加载包中的一个类来强制它加载包,如下所示:

this.getClass().getClassLoader().loadClass( "com.example.SomeClass" );
Package p = Package.getPackage( "com.example" ); //(returns non-null)

但是,这很黑客,需要提前知道属于该包的某些类的名称。

所以问题是 - 有没有办法按名称获取包的实例,无论ClassLoader是否做了任何事情?在这种情况下,我对类加载/包如何工作的假设是否准确?


答案 1

或者,您可以使用类根目录作为起点,遍历所有 *.class 文件和子目录。这只有在您事先知道所有.class文件将驻留在哪里时才有效。

造成这一切的原因是Java具有动态类加载功能,因此可以在运行时从编译时甚至启动时未知的位置加载类。因此,包的概念只是装入类的命名空间,而不是可用于查找它们的目录。


答案 2

我假设你需要这个,因为你需要检查它的注释。否则,您不会对拥有一个包引用感兴趣,该引用仅是围绕访问注释的操作。这导致假设您还有一个包信息.java那里定义了一些注释。

如果检查,您将看到 只是将包信息类作为普通类加载。java.lang.PackagegetPackageInfo

我遇到了同样的问题,并提出了这个解决方案。

public static Package getPackage(String packageName) throws ClassNotFoundException {
    Class.forName(packageName+".package-info"); // makes sure package info exist and that the class loader already knows about the package
    return Package.getPackage(packageName);
}

推荐