Class.forName()是什么意思

时间:2014-11-07 09:10:52

标签: java mysql class jdbc

我正在学习JDBC,唯一我得不到的是下面代码中的类Class。

我是否删除Class.forName("com.mysql.jdbc.Driver"),它是否正常工作。

你能解释一下这部分中的Class.forName(“com.mysql.jdbc.Driver”)是什么函数吗?

import java.sql.*;
public class JSP {

    public static void main(String[] args){
        Connection myConn = null;
        Statement st= null;
        ResultSet rs= null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            myConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/customer", "root", "Gspot");

            st = myConn.createStatement();
            String query = "select * from customers";

            rs = st.executeQuery(query);
            while(rs.next()){
                System.out.println(rs.getString("name"));
            }
        } catch(SQLException e){
            e.printStackTrace();
        } catch(ClassNotFoundException e) {
            System.out.println("wow");
        }
    }
}

4 个答案:

答案 0 :(得分:9)

Class.forName创建与给定名称对应的java.lang.Class实例。这会强制类加载器加载此类,并在其static块中执行任何代码。

旧的JDBC驱动程序曾经使用这些静态块将自己注册到java.sql.DriverManager,以便以后可以用它们连接到数据库。 JDBC 4是Java 6的一部分,它引入了一种自动加载JDBC驱动程序的机制,因此不再需要它。

答案 1 :(得分:4)

Class.forName("com.mysql.jdbc.Driver")将通过反射获取指定类的类对象。

如果该类存在,那么在代码中使用该行之间没有区别,那么您不会对返回值执行任何操作。但是,如果它没有存在于类路径中,那么您将从该调用中获得异常,因此您知道驱动程序丢失而不是连接失败。

假设类路径中没有MySQL驱动程序。

如果没有该声明,您可能会出现错误,例如"无法打开连接"并且你可能需要解析日志并查找原因。

如果调用该语句,您将获得ClassNotFoundException,因此您就知道问题的原因:类加载器找不到驱动程序类。

编辑:阅读@ Mureinik的回答,这可能是该声明的更好理由。 :)

答案 2 :(得分:1)

我建议你阅读本文:Understanding-ClassforName-Java

如果您正在调用Class.forName("com.mysql.jdbc.Driver");,则驱动程序类 com.mysql.jdbc.Driver 将被加载到内存中。每个这样的驱动程序类都有这样的静态块:

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

因此,如果您正在加载该类,则会自动调用静态块,驱动程序将会(如果成功)注册。

答案 3 :(得分:0)

根据文件(http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#forName(java.lang.String)):

  

对forName(“X”)的调用会导致名为X的类被初始化。

表示从磁盘加载类,并调用其静态初始值设定项,例如:

public class Test {
    private static final int a;    
    static { // called when the class is loaded via forName or any other loading mechanism
        a = 5;
        doSomething(a);
    }
    private static int doSomething(int x) {
        return (x+5);
    }
}

这只在加载类时发生一次。例如,在您的情况下,我们可以假设它允许驱动程序运行代码以将自身注册到JDBC中。

如果省略此调用不会改变运行时行为,则意味着该类之前已经加载过。