我需要以编程方式找出哪些JRE类可以在编译单元中被引用而无需导入(用于静态代码分析)。我们可以忽略包局部类。根据JLS, 来自
欢迎任何可靠的基于Java的解决方案。
如果我不必假设根本不存在rt.jar,而是扫描系统类加载器使用的资源列表,那就太好了。这种方法在供应商特定的JRE实现方面更加安全。
java.lang
包的类是隐式导入的。输出应该是二进制类名列表。解决方案应该适用于纯Java 5及以上版本(没有Guava,Reflections等),并且与供应商无关。欢迎任何可靠的基于Java的解决方案。
以下是我尝试过的一些注释:
乍一看,问题似乎归结为“如何从包中加载所有类?”,当然这几乎是不可能的,尽管存在几种解决方法(例如 this 和 this,以及链接到那里的博客文章)。但我的情况要简单得多,因为不存在多个类加载器的问题。 java.lang
的东西总是可以由系统/引导类加载器加载的,而你无法在该包中创建自己的类。问题在于,系统类加载器不会透露其类路径,而链接的方法依赖于此。
Object.class.getClassLoader()
返回null
,而Thread.currentThread().getContextClassLoader()
可以通过委派加载java.lang.Object
,但它本身不包括类路径。所以像this one这样的解决方案对我无效。此外,保证的系统属性列表不包括具有此类类路径信息(例如sun.boot.class.path
)的属性。如果我不必假设根本不存在rt.jar,而是扫描系统类加载器使用的资源列表,那就太好了。这种方法在供应商特定的JRE实现方面更加安全。
import java.lang.*;
。 - Jesperjava.lang
是一个被禁止的包名。我在问题中澄清了与java.lang
之外的包级局部类相关的问题。 - barfuin