博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Class.forName()的原理机制
阅读量:6859 次
发布时间:2019-06-26

本文共 846 字,大约阅读时间需要 2 分钟。

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

Class.forName("com..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的一个作用 实例。

转载于:https://www.cnblogs.com/MrLiu2016/p/5440128.html

你可能感兴趣的文章
JAVA设计模式之【抽象工厂模式】
查看>>
数字电视的电子节目指南(EPG)及其系统
查看>>
11 复用与多址
查看>>
附录A 编译安装Hadoop
查看>>
android studio building project info 错误
查看>>
【Scala】Scala之Control Structures
查看>>
三星手机拍照,从图库选择照片旋转问题完美解决
查看>>
算法笔记_173:历届试题 斐波那契(Java)
查看>>
菜鸟版JAVA设计模式—外观模式
查看>>
EasyUI----动态拼接EasyUI控件
查看>>
PHP session 跨子域问题总结 ini_set('session.cookie_domain', ".domain.com")
查看>>
Office WPS如何在页眉页脚添加一条横线
查看>>
站在 Android 开发的角度,聊聊 Airbnb 的 Lottie!!!
查看>>
数组去重Demo引出的思考
查看>>
javascript怎么禁用浏览器后退按钮
查看>>
AtomicLong可以被原子地读取和写入的底层long值的操作
查看>>
Android studio 将 Module 打包成 Jar 包
查看>>
Java中抽象类和抽象方法的区别
查看>>
任务调度JOB
查看>>
有关通过web来发送东西的小记住
查看>>