我目前正在使用反射从classes
字段中获取所有加载的类ClassLoader
,然后检查是否getPackage
等于我正在搜索的包。我遇到的一个问题是类没有被加载,ClassLoader
但我无法自己加载它们,Class.forName
因为我不知道类的名称,因为它们是动态加载的并且总是在变化。这些类的共同点之一是它们扩展了Module
. 我将如何从包中加载所有类?
提前致谢。
我目前正在使用反射从classes
字段中获取所有加载的类ClassLoader
,然后检查是否getPackage
等于我正在搜索的包。我遇到的一个问题是类没有被加载,ClassLoader
但我无法自己加载它们,Class.forName
因为我不知道类的名称,因为它们是动态加载的并且总是在变化。这些类的共同点之一是它们扩展了Module
. 我将如何从包中加载所有类?
提前致谢。
使用反射 API肯定可以工作。如果没有,您可能会以错误的方式设置它。我刚刚编写了这个示例,它独立于任何类加载器打印包中的所有类。
package com.test;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Set;
import org.reflections.Reflections;
import org.reflections.scanners.FieldAnnotationsScanner;
import org.reflections.scanners.MemberUsageScanner;
import org.reflections.scanners.MethodAnnotationsScanner;
import org.reflections.scanners.MethodParameterNamesScanner;
import org.reflections.scanners.MethodParameterScanner;
import org.reflections.scanners.SubTypesScanner;
import org.reflections.scanners.TypeAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.reflections.util.FilterBuilder;
public class Runner {
public static void main(String[] args) {
Reflections reflections = new Reflections();
FilterBuilder TestModelFilter = new FilterBuilder().include("com.test.*");
reflections = new Reflections(new ConfigurationBuilder()
.setUrls(Arrays.asList(ClasspathHelper.forClass(Runner.class))).filterInputsBy(TestModelFilter)
.setScanners(new SubTypesScanner(false), new TypeAnnotationsScanner(), new FieldAnnotationsScanner(),
new MethodAnnotationsScanner(), new MethodParameterScanner(), new MethodParameterNamesScanner(),
new MemberUsageScanner()));
Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class);
System.out.println(allClasses);
for (Iterator it = allClasses.iterator(); it.hasNext();) {
Class<? extends Object> clazz = (Class<? extends Object>) it.next();
System.out.println(clazz.getCanonicalName());
}
}
}
我有意添加了所有导入,因此您可以查看它使用的 API。这对你有用吗?