• classLoader和Class.forName的区别


    public class ClassLoaderOrClassForName{
    
        public static void main(String[] args) throws ClassNotFoundException{
            ClassLoader loader = ClassLoader.getSystemClassLoader();
            Class<?> loadClass = loader.loadClass("TestDiff");
            System.out.println("Load Class : " + loadClass.getName());
    System.out.println("------"); Class
    <?> forName = Class.forName("TestDiff"); System.out.println("Class for Name : " + forName.getName()); } } class TestDiff{ static { System.out.println("Static Method"); } }

    output:

    Load Class : TestDiff
    ------
    Static Method
    Class for Name : TestDiff

      Class.forName方法将类的.class文件加载到jvm的同时会执行static方法块中的内容。

      classLoader只会将类的.class文件加载到jvm中,不会执行static中的内容,只有在调用newInstance()方法调用构造函数,创建类的对象。

      

      JVM类加载机制分为五个部分:加载,验证,准备,解析,初始化。

      加载阶段会在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的入口

      验证阶段主要是为了确保Class文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害jvm自身的安全

      准备阶段是正式为类变量分配内存并设计类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间

      解析阶段是指虚拟机将常量池中的符号饮用替换为直接应用的过程,符号引用就是class文件中的CONSTANT_Class_info,CONSTANT_Field_info,CONSTANT_Method_info

      初始化阶段是类加载最后一个阶段。初始化阶段是执行类构造器<client>方法的过程。<client>方法是由编译器自动收集类中的类变量的赋值操作和静态语句块中的语句合并而成。虚拟机会保证<client>方法执行前,父类的<client>方法已经执行完毕。

      JVM提供了3种类加载器

        Bootstrap ClassLoader:负责加载JAVA_HOMElib目录中的,或通过Xbootclasspath参数指定路径中的,且被虚拟机认可的类

        Extension ClassLoader:负责加载JAVA_HOMElibext目录中的,或通过java.ext.dirs系统变量指定路径中的类库

        Application ClassLoader:负责加载用户路径上的类库

  • 相关阅读:
    【算法】一致性Hash算法
    P1576 最小花费 题解
    Vijos1234 口袋的天空 题解
    P1379 八数码难题 题解
    Tarjan求无向图必经点 笔记
    P3372 【模板】线段树 1 题解
    CF1332A Exercising Walk 题解
    P6270 [SHOI2002]取石子游戏 题解
    P6269 [SHOI2002]空中都市 题解
    P6268 [SHOI2002]舞会 题解
  • 原文地址:https://www.cnblogs.com/forerver-elf/p/9242053.html
Copyright © 2020-2023  润新知