Class.forName(String className)这个方法传入一个类型的全路径的名字(也就是带包的完整名字),会返回一个字节码类型(也就是Class类型)的实例
如:Class clazz = Class.forName("com.dean.Person");
然后再用这个字节码类型的实例clazz调用newInstance()方法会返回一个Object类型的对象
如下:Object object = clazz.newInstance();
这个object当然不能直接调用Perosn类的方法了,因为他是Object类型
这个时候就需要强制类型转换了
Person person = (Perosn)clazz.newInstance();
下面再解释一个加载数据库驱动时不用newInstance方法的原因:
如下:
Class.forName("com.mysql.jdbc.Driver");
并没有写成:
Driver driver = (Driver)Class.forName("com.mysql.jdbc.Driver").newInstance();
DriverManager.registerDriver(driver);
不过我再查看com.mysql.jdbc.Driver类的源码时发现了:
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
我的理解是这样的,当Class.forName("com.mysql.jdbc.Driver");被执行到时相当于com.mysql.jdbc.Driver的字节码实例被加载到内存了
而按照类的初始化顺序静态代码块也应该被执行了,也就是说Class.forName("com.mysql.jdbc.Driver");看似一句实际上相当于下面两句
Class.forName("com.mysql.jdbc.Driver");
java.sql.DriverManager.registerDriver(new Driver());
所以大多数jidbc连接代码写完Class.forName("com.mysql.jdbc.Driver");这句就去拿数据库连接了,几乎看不到注册驱动的代码。
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.Statement;
public class MysqlDemo {
public static void main(String[] args) throws Exception {
Connection conn = null;
String sql;
//下面语句之前就要先创建javademo数据库
String url = "jdbc:mysql://localhost:3306/javademo?"
+ "user=root&password=root&useUnicode=true&characterEncoding=UTF8";
try {
//动态加载mysql驱动
Class.forName("com.mysql.jdbc.Driver");
System.out.println("成功加载MySQL驱动程序");
//一个Connection代表一个数据库连接
conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
sql = "create table student(NO char(20),name varchar(20),primary key(NO))";
int result = stmt.executeUpdate(sql);//
if (result != -1) {
System.out.println("创建数据表成功");
sql = "insert into student(NO,name) values('2012001','陶伟基')";
result = stmt.executeUpdate(sql);
sql = "insert into student(NO,name) values('2012002','周小俊')";
result = stmt.executeUpdate(sql);
sql = "select * from student";
ResultSet rs = stmt.executeQuery(sql);
System.out.println("学号\t姓名");
while (rs.next()) {
System.out
.println(rs.getString(1) + "\t" + rs.getString(2));
}
}
} catch (SQLException e) {
System.out.println("MySQL操作错误");
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
conn.close();
}
}
}