Java Class.forName()是什么意思
我在学习JDBC,唯一没有得到的是下面代码中的类 无论我是否删除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
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不需要这个技巧,它使用清单中的服务来查找这些类,因此您不需要它。