Class.forName()时程序底层是运行了什么

Class.forName()时程序底层是运行了什么

问题描述:

学习这节课时,发现了一个不懂的知识点,之前的课程应该也没有讲过把,Class.forName()时程序作了什么事情,之后的Java课程总有讲吗,我觉得弄清楚才方便记忆,而且Java的一些高级用法也确实很有必要去掌握,因此看到我就想问问清楚

相关截图:

http://img1.sycdn.imooc.com//climg/609cbf7c0967c6e406610198.jpg

正在回答

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

2回答

同学你好,

1、Class.forName()是反射机制的一种,用于获取指定的Class对象。这里Class.forName("com.mysql.cj.jdbc.Driver") 是通过反射的方式加载这个Driver,使其被加载到虚拟机中

2、在后面课程《Java反射》会讲解到,这里同学可继续往后学习

祝学习愉快~


  • WittChen 提问者 #1

    老师您好,就这个问题我想又有新的问题,既然说到加载Driver,那就说明Driver不在虚拟机中因此我们要手动把他加载进去,这里我又有疑问了,我们编写的那么多类,不是在程序运行的时候就全部加载进去的吗,可能这里我没学好,类是在什么时候加载进虚拟机当中的

    1、为什么我们已经把mysql驱动程序的jar包加入了,程序运行的时候没有把它加载进去,

    2、我不能用import导入的方式或者直接实例化Driver的形式把Driver加载进来吗,为什么一定要用反射呢

    2021-05-13 20:54:53
  • 好帮手慕小脸 回复 提问者 WittChen #2

    同学你好,

    1、当我们通过“new”关键字创建出一个对象实例时,会将该类加载到虚拟机中。

         当我们访问一个类的静态方法或者静态属性时,会将该类加载至虚拟机中。

        ​ 通过反射(使用Class.forName()方法),也会导致类加载

    2、添加mysql的jar包与加载数据库驱动是两个步骤。

    3、因为反射是运行时根据全类名动态生成的Class对象,完全可以把这个全类名写在xml或者properties中去,不仅从代码上解耦和,而且需要更换数据库时,不需要进行代码的重新编译,这比直接new一个com.mysql.jdbc.Driver方便很多

    祝学习愉快~

    2021-05-14 10:39:18
rock221 2021-05-13 17:06:28

Class.forName()->获取指定Class对象  (ClassJVM中代表类和接口的类)。

实际的含义就是再程序运行的时候,去加载mysql的jdbc驱动,从而可以获取到对应的驱动类,其实你可以理解成实例化类,只是这个实例化是运行的时候动态创建的,而不是我们写死的。

后面的反射课程会详细讲解。

  • 提问者 WittChen #1

    很高兴你能帮我解答,就这个问题我想多跟你讨论讨论,运行是动态创建我也可以new 实例化对象一直是程序运行时创建的吧,只有在静态代码块中的new是在类加载的时候实例化对象

    2021-05-13 20:49:16
  • rock221 回复 提问者 WittChen #2

    不客气,你是想说,我也可以运行的时候new一下创建个对象, 为什要反射加载类,对吧?

    讨论阿:

    new是写死的,必然会被加载,而反射是灵活的,当运行到它时才会对这个类加载,它才会去加载里面的东西,至于我说的可以理解为实例化,是因为这个类的内部对Driver进行了实例, 有些反射加载类也需要我们newinstance()实例的。 具体讲解后面的反射课程有详细的说明。 现在程序的代码少,不能体现什么,如果工程大的话, 过多的new是会占内存的 。反射就不会啦,不运行它的时候,它是不会产生任何东西的。

    内部?

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

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


    2021-05-13 22:24:22
  • 提问者 WittChen 回复 rock221 #3

    感谢,以后多讨论

    2021-05-15 09:04:53
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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