【java基础】Class.forName和ClassLoader.loadClass的认识
一些看到的博客总结:
Java装载:
加载:类全限定名获取二进制字节流,将其转换为方法区中运行时数据结果,在内存生成java.lang.class(class文件字节码加载至内存,静态数据装换成运行时数据去中方法区的类型数据,运行时堆中生成代表这个类的java.lang.Class对象,方法去数据访问入口)
链接:执行下面步骤,解析可选
校验:检查导入类或接口的二进制数据的正确性和安全性(文件格式、元数据、字节码、符号引用验证)
准备:给类的静态变量分配、初始化存储空间(默认值)
解析:将常量池中的符号引用转成直接的引用
初始化:**类的静态变量的初始化java代码和静态java代码块、变量值
Class.forName(className):全限定名、是否解析、对应加载器
调用class.forName(className,true,ClassLoader.getClassLoader(caller))
第二个是否需要初始化,只有一个参数:默认需初始化,初始化便触发目标对象的static块 代码执行、static参数再次初始化
ClassLoader.loadClass(className)
调ClassLoader.loadClass(className,false)
第二个参数:目标对象是否进行链接,false不进行(不进行包括初始化等步骤、静态块、对象不执行)
例子:
数据库链接使用forName(className)
static { try { java.sql.DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } }https://www.cnblogs.com/zabulon/p/5826610.html |
例子2:加载与初始化类
class Tester { static { System.out.println("Tester类的静态初始化块..."); } https://www.cnblogs.com/suibianle/p/6676215.html } public class ClassLoaderTest { public static void main(String[] args) throws ClassNotFoundException { ClassLoader cl = ClassLoader.getSystemClassLoader(); // 下面语句仅仅是加载Tester类 cl.loadClass("com.xtli.controller.classLoader.Tester"); System.out.println("系统加载Tester类"); // 下面语句才会初始化Tester类 Class.forName("com.xtli.controller.classLoader.Tester"); System.out.println(); } } https://blog.****.net/lixingtao0520/article/details/72901799 |
即forName得到的class已经初始化完成,loaderClass得到的class没有链接
感谢分享:
https://blog.****.net/lixingtao0520/article/details/72901799
https://www.cnblogs.com/zabulon/p/5826610.html
https://www.cnblogs.com/suibianle/p/6676215.html