关于Class.forName()的问题

关于Class.forName()的问题

Class.forName("com.mysql.cj.jdbc.Driver")与new Driver(),两者有什么本质区别,底层运行机制和功能有何具体不同,Class类的本质是什么,与其他类的区别在哪里?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕阿莹 2019-11-02 14:31:34

1、Class.forName("com.mysql.cj.jdbc.Driver") 是通过反射的方式加载这个Driver,使其被加载到虚拟机中,在加载这个类的同时,Driver中的静态代码块儿被执行

http://img1.sycdn.imooc.com//climg/5dbd1f45093844c908320230.jpg

     而这个DriverManager.registerDriver(new Driver())  则是DriverManager中的一个方法,它需要传入一下Driver对象,而恰巧Driver 的静态代码块儿中也已经调用了这个方法。所以会被注册两次,一般我们不使用这个方法。

2、

Class实例是JVM内部创建的,如果我们查看JDK源码,可以发现Class类的构造方法是private,只有JVM能创建Class实例,我们自己的Java程序是无法创建Class实例的。

JVM为每个加载的类创建了对应的Class实例,并在实例中保存了该class的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段等,因此,如果获取了某个Class实例,我们就可以通过这个Class实例获取到该实例对应的class的所有信息。如果知道一个类的完整类名,可以通过静态方法Class.forName()获取该类的实例。这种获取实例的方法被称为反射。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 慕沐8221787 #1
    使用new Driver(),不是也需要执行Driver 的静态代码块吗?
    2019-11-02 15:22:25
  • 好帮手慕阿莹 回复 提问者 慕沐8221787 #2
    同学你好,这两个都可以的,但new Driver()并不常用,new Driver() 是编译时期进行加载,而 Class.forName("com.mysql.cj.jdbc.Driver")是需要使用时动态加载的,动态加载的更加节省内存资源,一般我们通常使用 Class.forName(“com.mysql.cj.jdbc.Driver”) 这种方式哦。 如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-11-02 16:57:41
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java数据库开发与实战应用2018版
  • 参与学习           人
  • 提交作业       277    份
  • 解答问题       4297    个

Java数据库开发的必备技能,从流行的MySQL数据库开始,到Java原生的数据库管理接口JDBC的使用,再到常用的数据持久化框架MyBatis,让你向Java工程师的目标又迈进了一步!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师