【java基础】Class.forName和ClassLoader.loadClass的认识

一些看到的博客总结:

Java装载:

 【java基础】Class.forName和ClassLoader.loadClass的认识_第1张图片

    加载:类全限定名获取二进制字节流,将其转换为方法区中运行时数据结果,在内存生成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.csdn.net/lixingtao0520/article/details/72901799

即forName得到的class已经初始化完成,loaderClass得到的class没有链接


 感谢分享:

 https://blog.csdn.net/lixingtao0520/article/details/72901799

https://www.cnblogs.com/zabulon/p/5826610.html

 https://www.cnblogs.com/suibianle/p/6676215.html

你可能感兴趣的:(java基础)