JAVA类加载浅谈

类加载器
        1. 引导类加载器
                负责加载系统的内核文件,如 java.lang、java.util包等
                搜录路径为: JAVA_HOME/jre/lib 及 JAVA_HOME/lib
               
       2. 扩展类加载器
                负责加载JDK的扩展包,搜寻路径为:JAVA_HOME/jre/lib/ext
               
       3. 系统类加载器
                负责加载用户的自定义类型;
       
        4. 自定义类加载器
                根据业务规则来加载
               
各种类加载器的关系:
        引导类加载器
               |
         扩展类加载器
               |
           系统类加载器
               |
            自定义类加载器
       
       
相关API:
java.lang.Class
                getClassLoader()                --> ClassLoader
java.lang.ClassLoader
                getParent()                --> ClassLoader
                loadClass(String name,  boolean resolve)
                findLoadClass(String name);
                findClass(String);
                defineClass(String name, byte[] buf, int off, int len);
               
类加载的原理:
1.所有类的加载都会递归地调用父类的类加载器来加载类, 采用的是一种代理的方式
如下:
比如, JVM现在在加载 org.example.Student 这个类, 则首选会加载 Object类, 因为任何类都继承于 java.lang.Object
而Student的类加载器,在默认情况下为sun.misc.Lanucher$AppClassLoader,   依据代理方式        ,它会先去代理给父类的加载器【扩展,再到引导】
由父类加载器尝试去加载 Object, Student, 当然, 引导类加载器可以加载到 Object类,但加载不到 Student, 所以,最终, Student会被 应用类加载器所加载;

2. 类加载器 ClassLoader 加载类时,调用方法的顺序为:
   首先根据完整的全限定名 去调用 loadClass 方法 【此方法实现了 代理的方式,会依次代理给父类加载器】
   在loadClass方法内会调用 findLoadClass, 来查找此类之前是否已加载过, 如果有,则返回,如果没有,则调用
   findClass 方法去查找, 【ClassLoader默认情况下会依据 classpath环境变量来查找】
   最后调用 defineClass 把字节码转换成 java.lang.Class的一个实例;

你可能感兴趣的:(java,jvm,ClassLoader)