关于jdbc中的DriverManager注册与反射机制;

刚接触jdbc就有一个很严重的问题困扰着我:

当我们把数据库注册进DriverManager中的时候,我们居然只需要调用Class.forName("某数据库")装载类到JVM里面就可以了,这是另我很不解的,为毛不需要实例化啊;

你不实例化DriverManager究竟是靠什么找到这个数据库的呢?


这得靠反射完成:

1.首先我们的了解static语句块的作用:

在每一个类中写了static语句块的话,当我们进行反射时Class.forName我们调用class的这个方法将类装载到我们的jvm时候,我们static就会调用一次(注意是一次,这就表明不是我们每次实例化都调用他,无论你实例化几次他都是只调用一次);

2.static语句块能做什么:

这样的话,就是说当我们在用Class.forName("com.mysql.jdbc.Driver")(单单拿mysql举例子)的时候,我们会调用com.mysql.jdbc.Driver的static一次;

3.这种机制能做什么:

我们看看反编译com.mysql.jdbc.Driver的结果(话说com.mysql.jdbc.Driver真是吊炸):

package com.mysql.jdbc;

import java.sql.DriverManager;
import java.sql.SQLException;

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
  public Driver() throws SQLException { }

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

果然是自己调用然后将自己注册上去,这样就很明了了,无论我们

Class.forName("com.mysql.jdbc.Driver");

       Class.forName("com.mysql.jdbc.Driver").newInstance();

new com.mysql.jdbc.Driver(); 

这样三种写都是可以很方便的注册上去(都吊了static);

4.作用:我估计是用来节省内存啥的吧



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值