zoukankan      html  css  js  c++  java
  • Class.forName()的原理机制

    Java课上交过jdbc连接数据库。可是老师也没说当中 这样的代码是什么意思:

    Class.forName("com.MySQL.jdbc.Driver");
    conn = DriverManager.getConnection(URL);

    很久前 看到一个面试题 大概也是问这几行代码的意思。没去研究。

    今天看了java反射机制后 了解了下。大概是这样的。

    java中一个类被实例化前他首先需要被加载。

    加载时 会运行这个类中的static代码。

    加载这个环节有什么作用?举个例子:比如说java loader在load一个远程服务器上类A的时候,它会执行类A中的static部分

    如:

    Class A{

    static{

    ....

    date time ;

    }

    }

    此时可以加上时间戳,表示加载时间。

    回到JDBC的问题:

    JDBC规范中要求这个Driver类必须向DriverManager注册自己。

    所以在执行

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

    这行代码时。JVM会加载 名字为 com.mysql.jdbc.Driver的这个Driver类。

    而com.mysql.jdbc.Driver 这个类的代码应该是这样的:

    Class com.mysql.jdbc.Driver {

    static{

    // regist self  to DriverManager

    }

    }

    此时,这个Driver类就被加载了,由于静态部分被执行,同时这个Driver也被注册进入了DriverManager中。

    PS:此时这个Driver没有被实例化。被实例化的只是描述他结构的类(Class)

    在就是第二句代码:
    conn = DriverManager.getConnection(URL);

    从DriverManager取得连接。

    这也是reflection的一个作用 实例。

  • 相关阅读:
    python list dict 去重的两种方式
    python 发送邮件
    mongo 查询总结
    vsftpd 安装配置
    简单配置 nginx 反向代理
    python 检查内存
    python ldap
    Centos 7 vsftpd ldap 配置
    centos7虚拟机开启端口后 外部不能访问的问题
    Linux下安装配置rocketmq (单个Master、双Master)
  • 原文地址:https://www.cnblogs.com/MrLiu2016/p/5440128.html
Copyright © 2011-2022 走看看