不使用第三方,不使用属性文件,不指定包名,获取整个系统中某一个接口所有的实现类,纯Java实现
public class ClassFinder {
public static List<Class<?>> getImplementationsOfMyService(Class<?> clazz) {
List<Class<?>> implementations = new ArrayList<>();
String packageName = "";
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Enumeration<URL> resources = null;
try {
resources = classLoader.getResources(packageName.replace('.', '/'));
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
File file = new File(resource.getFile());
scanDirectory(clazz, file, "", implementations);
}
} catch (IOException e) {
e.printStackTrace();
}
return implementations;
}
private static void scanDirectory(Class<?> clazz, File dir, String pkg, List<Class<?>> list) {
if (!dir.exists()) return;
for (File file : Objects.requireNonNull(dir.listFiles())) {
if (file.isDirectory()) {
scanDirectory(clazz, file, pkg + file.getName() + ".", list);
} else if (file.getName().endsWith(".class")) {
String className = pkg + file.getName().replace(".class", "");
try {
Class<?> tmp = Class.forName(className);
if (clazz.isAssignableFrom(tmp) && !tmp.isInterface()) {
list.add(tmp);
}
} catch (Exception ignored) {
}
}
}
}
public static void main(String[] args) throws Exception {
List<Class<?>> classes = getImplementationsOfMyService(AnnotationHandler.class);
System.out.println("找到以下实现类:");
for (Class<?> c : classes) {
System.out.println(c.getName());
}
}
}