Class.forName(String className)和Class.forName(String className).newInstance()两个方法

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");这句就去拿数据库连接了,几乎看不到注册驱动的代码。

猜你喜欢

转载自blog.csdn.net/weixin_44182586/article/details/100899836