群里有个人问的,java下怎么获取指定包下的类。例如获取java.lang包下都包含什么类。
classloader
java的classloader为双亲委派模式。但是只能获取到用户编写的类,并不能获取到诸如java.lang等系统包下的类。在java中,java.lang等包是由bootstrap classloader去负责加载。
Bootstrap ClassLoader称为启动加载器,是Java类中加载层次最顶层的类加载器,负责加载JDK中的核心类库,如rt.jar,resources.jar,charsets.jar等。bootstrap classloader由c++编写,在java中是无法访问的。既然无法访问,我们就无法通过反射等方法去获取系统核心包下包含的类。
访问jar包
通过classloader获取加载的package,然后通过Reflection扫描包中的类即可
代码如下
List classLoadersList = new LinkedList();
classLoadersList.add(ClasspathHelper.contextClassLoader());
classLoadersList.add(ClasspathHelper.staticClassLoader());
Reflections reflections = new Reflections(new ConfigurationBuilder()
.setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner())
.setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[0])))
.filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("org.example"))));
Set> allClasses =
reflections.getSubTypesOf(Object.class);
allClasses.stream().forEach(System.out::println);