gpt4 book ai didi

java - 查找已安装的 JDBC 驱动程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:08:01 25 4
gpt4 key购买 nike

我正在用 Java 编写一个数据库验证工具,并且有首选项屏幕,因此用户可以定义他们的数据库连接。该工具至少应该能够应对 DB2、Oracle、Postgresql 和 Mysql。

作为此过程的一部分,我真正想要的是能够向用户展示他们已安装的 jdbc 驱动程序的列表。

任何人都可以提供代码片段来发现已安装的 JDBC 驱动程序吗?

最佳答案

至此,您需要扫描整个类路径(和子文件夹)以查找实现 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这一切都在一行中完成:

Set<Class<? extends Driver>> drivers = reflections.getSubTypesOf(Driver.class);

关于java - 查找已安装的 JDBC 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1839671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com