Java 有没有一种方法可以强制类加载器加载一个包,即使它的类都没有加载?

Java 有没有一种方法可以强制类加载器加载一个包,即使它的类都没有加载?,java,class,package,classloader,Java,Class,Package,Classloader,假设java代码库有一个名为“com.example”的包 在运行时,我们可以通过调用 Package p = Package.getPackage( "com.example" ); //(returns null) Packages[] ps = Package.getPackages(); 甚至可以通过调用获取所有包的列表 Package p = Package.getPackage( "com.example" ); //(returns null) Packages[] ps =

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

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

Package p = Package.getPackage( "com.example" ); //(returns null)
Packages[] ps = Package.getPackages();
甚至可以通过调用获取所有包的列表

Package p = Package.getPackage( "com.example" ); //(returns null)
Packages[] ps = Package.getPackages();
问题是-如果类加载器还没有从包中加载任何类,它将无法用于这些函数调用。我们可以通过先强制加载包中的一个类来强制它加载包,如下所示:

this.getClass().getClassLoader().loadClass( "com.example.SomeClass" );
Package p = Package.getPackage( "com.example" ); //(returns non-null)
然而,这是一种黑客行为,需要提前知道属于包的某个类的名称


所以问题是——不管类加载器是否做了任何事情,有没有办法通过名称获取包的实例?我关于类加载/包在这种情况下如何工作的假设是否准确

恐怕你的假设是无效的。类装入器在装入类时进行包簿记

您可以将通配符传递给
ClassLoader.getResources
,并强制它拾取包中的类,这将反过来完成工作


您可以创建自己的类加载器来调用
definePackage
,但这对您使用的普通类加载器没有帮助。

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


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

我假设您需要它,因为您需要检查它的注释。否则,您就不会对只有操作才能访问注释的包引用感兴趣。这导致了这样一种假设,即您在这里还定义了一个package-info.java,其中包含一些注释

如果选中
java.lang.Package
,您将看到
getPackageInfo
只是将Package info类作为普通类加载

我也有同样的问题,并提出了这个解决方案

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);
}
提防