不使用第三方,不使用属性文件,不指定包名,获取整个系统中某一个接口所有的实现类,纯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());}}
}