到目前为止,您需要扫描整个类路径(和子文件夹)以查找实现类的类
java.sql.Driver。这样,您还将涵盖 没有
由手动
Class#forName()或自动加载的驱动程序
meta-INF/services。
这是一个基本示例:
public static void main(String[] args) throws Exception { List<Class<Driver>> drivers = findClassesImplementing(Driver.class); System.out.println(drivers);}public static <T extends Object> List<Class<T>> findClassesImplementing(Class<T> cls) throws IOException { List<Class<T>> classes = new ArrayList<Class<T>>(); for (URL root : Collections.list(Thread.currentThread().getContextClassLoader().getResources(""))) { for (File file : findFiles(new File(root.getFile()), ".+\.jar$")) { JarFile jarFile = new JarFile(file); for (JarEntry jarEntry : Collections.list(jarFile.entries())) { String name = jarEntry.getName(); if (name.endsWith(".class")) try { Class<?> found = Class.forName(name.replace("/", ".").replaceAll("\.class$", "")); if (cls.isAssignableFrom(found)) { classes.add((Class<T>) found); } } catch (Throwable ignore) { // No real class file, or JAR not in classpath, or missing links. } } } } return classes;}public static List<File> findFiles(File directory, final String pattern) throws IOException { File[] files = directory.listFiles(new FileFilter() { public boolean accept(File file) { return file.isDirectory() || file.getName().matches(pattern); } }); List<File> found = new ArrayList<File>(files.length); for (File file : files) { if (file.isDirectory()) { found.addAll(findFiles(file, pattern)); } else { found.add(file); } } return found;}相反,您也可以考虑使用Google Reflections
API,该API可在一行中完成所有操作:
Set<Class<? extends Driver>> drivers = reflections.getSubTypesOf(Driver.class);



