【问题标题】:Java JAR (library) usageJava JAR(库)使用
【发布时间】:2014-06-18 08:29:13
【问题描述】:

我曾经在 Eclipse 中使用过一个 GSON 库,它非常简单。 只需将它添加为外部库并在源文件中我已经导入它并且能够像 Java 中的任何其他类一样使用它。 示例:

Gson gson = new Gson(); //and just use it

最近我不得不使用SQLIte 数据库文件,所以我下载了 JDBC 驱动程序库并将其添加到我的 Eclipse 项目中。 但我注意到使用它有一种奇怪的(至少对我而言)语法。 我已经导入了java.sql.*,但为了能够使用它的类,我必须执行以下操作:

 Class.forName("org.sqlite.JDBC");

我知道该命令的返回值是 Class 对象(在运行时),但从语法中可以看出它从未使用过。

请解释那里发生了什么以及为什么我不能只使用 SQL 包类而不首先调用 Class.forName

【问题讨论】:

标签: java jdbc


【解决方案1】:

基本上,它让 JVM 注册您的代码正在使用的 java.sql.* 库的哪个实现。通过这种方式,您可以依赖标准接口,而无需经历需要实现级详细信息的麻烦和障碍。

【讨论】:

    【解决方案2】:

    它动态加载一个类。 What does Class.forname method do? 是一篇关于它的好文章,它还解释了为什么数据库驱动程序需要它:

    让我们看看为什么需要 Class.forName() 将驱动程序加载到内存中。所有 JDBC 驱动程序都有一个静态块,它向 DriverManager 注册自身,而 DriverManager 仅具有静态初始化程序。

    MySQL JDBC 驱动程序有一个静态初始化器,如下所示:

    static {
        try {
            java.sql.DriverManager.registerDriver(new Driver());
        } catch (SQLException E) {
            throw new RuntimeException("Can't register driver!");
        }
    }
    

    JVM 执行静态块,Driver 向 DriverManager 注册自己。

    您需要一个数据库连接来操作数据库。为了创建与数据库的连接,DriverManager 类必须知道您要使用哪个数据库驱动程序。它通过遍历已注册的驱动程序数组(内部是一个 Vector)并在数组中的每个驱动程序上调用 acceptURL(url) 方法来实现这一点,有效地要求驱动程序告诉它它是否可以处理 JDBC网址。

    来源 - What does 'Class.forName("org.sqlite.JDBC");' do?

    【讨论】:

    • 我认为强制驱动程序注册自己将是一种更简洁的方法是使用静态方法让我们说 Init。 Class.forName 看起来有点像导致 JVM 调用驱动程序的静态初始化程序的解决方法。
    • 您可以将答案标记为与该问题重复。
    • @MarkRotteveel 哦,抱歉,我知道可以将其标记为重复,但我认为它仅适用于管理员。我只是想帮忙,因为我自己是 StackOverFlow 的新手 :)
    • @JobNick 与现代 JDBC 驱动程序(即具有符合 JDBC 4 的 META-INF/services/java.sql.Driver 文件的驱动程序),驱动程序将自动加载。同样最初使用Class.forName 的原因之一是为了简化基于组件的应用程序的加载(例如,加载用户指定的驱动程序类的数据库工具,或从多个组件编排的应用程序)。拥有init() 方法需要加载类,然后通过反射调用init 方法;不能保证线程安全的操作(类加载)
    • @malgm 没问题。从技术上讲,每个人都是 stackoverflow 的版主,但您的权力取决于您当前的声誉。标记会通知其他拥有更多权力的人,最终您可以自己投票,等等。
    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 2011-10-04
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多