Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Class.forName()是什么意思_Java_Mysql_Class_Jdbc - Fatal编程技术网

Java Class.forName()是什么意思

Java Class.forName()是什么意思,java,mysql,class,jdbc,Java,Mysql,Class,Jdbc,我在学习JDBC,唯一没有得到的是下面代码中的类 无论我是否删除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

我在学习JDBC,唯一没有得到的是下面代码中的类

无论我是否删除
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");
        }
    }
}
Class.forName(“com.mysql.jdbc.Driver”)
将通过反射获取命名类的类对象

如果该类存在,那么代码中是否有该行没有区别,您没有对返回值做任何操作。但是,如果类路径上不存在该驱动程序,那么您将从该调用中得到一个异常,因此您将知道驱动程序丢失,而不是连接失败

假设MySQL驱动程序不在类路径上

如果没有该语句,您可能会出现类似“无法打开连接”的错误,您可能需要解析日志并查找原因

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


编辑:阅读@Mureinik的答案,这可能是该陈述的更好理由。:)

Class.forName
创建一个与给定名称对应的实例。这将强制类加载器加载此类,并执行其
静态块中的任何代码


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

根据文档():

对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中


如果省略此调用不会改变运行时行为,则表示该类以前已加载。

我建议您阅读本文:

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

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

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

JDBC 4不需要这个技巧,它使用清单中的服务来查找这些类,因此您不需要它。