每日一题,你来投稿,我来解答!
反射中Class.forName和ClassLoader的区别
一: 区别
1、两者都可以对类进行加载。ClassLoader遵循的是双亲委派模型,最终调用启动类加载器,实现通过一个类的全限定名获取该类的二进制字节流,放入到JVM中。forName最终也是调用ClassLoader来实现。
2、Class.forName对类加载时进行了初始化,而ClassLoader的loadClass并没有对类进行初始化,只是将类添加到了虚拟机中。
二: 使用场景
1、Spring中的IOC使用了ClassLoader的方式加载
2、JDBC中用了Class.forName的方式,因为JDBC规范中明确需要Driver即数据库驱动类必须向DriverManager注册自己。
二: 为什么被Static修饰的方法和属性可以直接通过类名访问
类是保存在字节码文件中的,JAVA中的类加载是指通过I/O流将类的字节码文件加载到JVM中。JVM会通过类的路径来找到字节码,被static修饰的变量、方法在类加载到JVM中时就被创建并初始化了,类的加载只会进行一次,故被static修饰的方法、变量可以直接通过类名进行访问。
想了解更多或者投稿,欢迎关注和私信回复【每日一题】或【面试资料】。