我曾经在Eclipse中使用过一次GSON库,这很容易。 刚刚将它添加为外部库,并在源文件中导入了它,并且能够像使用Java中的任何其他类一样使用它。 例如:
Gson gson = new Gson(); //and just use it
最近我不得不使用SQLIte
数据库文件,所以我下载了JDBC驱动程序库并将其添加到我的Eclipse项目中。
但我注意到使用它有一种奇怪的(至少对我而言)语法。
我导入了java.sql.*
但是为了能够使用它的类,我必须执行以下操作:
Class.forName("org.sqlite.JDBC");
我知道这个命令的返回值是Class对象(在运行时),但从语法中可以看出它永远不会被使用。
请解释那里发生的事情以及为什么我不能在不首先调用Class.forName
的情况下使用SQL包类。
答案 0 :(得分:1)
它动态加载一个类。 What does Class.forname method do?是一篇很好的文章,它也解释了为什么数据库驱动程序需要它:
让我们看看为什么需要Class.forName()将驱动程序加载到内存中。所有JDBC驱动程序都有一个静态块,它使用DriverManager注册自己,而DriverManager只有静态初始化程序。
MySQL JDBC Driver有一个静态初始化程序,如下所示:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
JVM执行静态块,驱动程序使用DriverManager注册自己。
您需要数据库连接来操作数据库。为了创建与数据库的连接,DriverManager类必须知道要使用哪个数据库驱动程序。它通过遍历已向其注册的驱动程序的数组(内部为Vector)并在数组中的每个驱动程序上调用acceptsURL(url)方法来实现,有效地要求驱动程序告诉它是否可以处理JDBC URL。
答案 1 :(得分:0)
基本上,它允许JVM注册您的代码正在使用的java.sql.*
库的实现。通过这种方式,您可以依赖标准接口,而无需通过需要实施级别详细信息的环节和障碍。