JVM虚拟机------类加载器

类加载器分类

public class StackStruTest {
    public static void main(String[] args) {
        // 对用户自定义个类来说:默认使用系统类加载器进行加载-----AppClassLoader
        ClassLoader classLoader = StackStruTest.class.getClassLoader();
        System.out.println(classLoader);

        // 获取其上层:扩展类加载器   -------ExtClassLoader
        ClassLoader extClassLoader = classLoader.getParent();
        System.out.println(extClassLoader);

        // 获取其上层:获取不到引导类加载器---bootStrapClassLoader ----- 但是获取不到的所以是null
        ClassLoader bootstrap = extClassLoader.getParent();
        System.out.println(bootstrap);

        // 么的了,所以会报错
        ClassLoader --- = bootstrap.getParent();
        System.out.println(---);
    }
}

 

 

 虚拟机自带的加载器

Bootstrap ClassLoader 启动类加载器

  1. 这个类加载器通过c/c++语言实现,嵌套再JVM内部
  2. 它用来加载Java核心库(jre/lib/rt.jar)(rt:runtime)或者sun.boot.class.path路径下的内容,用于JVM自身需要的类
  3. 并不继承自java.lang.ClassLoader,没有父加载器
  4. 加载【扩展类】和【应用加载器】,并指定为他们的父类加载器
  5. 出于安全考虑,Bootstrap启动类加载器只加载java、javax、sun等开头的类

扩展类加载器  Extension ClassLoader

  1. java语言编写,由sun.misc.Launcher$ExtClassLoader实现
  2. 派生于ClassLoader
  3. 父类加载器为启动类加载器
  4. 从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/lib/ext子目录下加载类库。如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载

应用程序类加载器 AppClassLoader

  1. 由java编写,sun.misc.Launcher$AppClassLoader实现
  2. 派生于ClassLoader
  3. 父类加载器为扩展器加载器
  4. 它扶着加载环境变量classpath或者系统属性 java.class.path指定路径下的类库
  5. 该类加载是程序中默认的类加载器,一般来说,java应用的类都是由它来完成加载
  6. 通过ClassLoader #getSystemClassLoader()方法可以获取到该类的加载器

用户自定义加载器

 

 

 

 ClassLoader

抽象类

getParent():返回该类的超类加载器

loadClass(String name):查找name的类,返回结果为Java.lang.class类的实例

findClass(String name):查找name的类,返回结果为java.lang.class类的实例

findLoadedCLass(String name):查找name的已经被加载过的类,返回结果为Java.lang.class类的实例

defineClass(String name, byte[]b, int off, int len):把字节数组b中的内容转换为一个Java类,返回结果为Java.lang.Class类的实例

resolveClass(Class<?>c),连接指定的java类

 

获取当前的ClassLoader途径

class.getClassLoader()

Threa.currentThread().getContextClassLoader()

ClassLoader.getSystemClassLoader()

DriveManager.getCallerClassLoader()

 

相关文章

jinfo 命令可以用来查看 Java 进程运行的 JVM 参数,命令如下...
原文链接:https://www.cnblogs.com/niejunlei/p/5987611.ht...
java 语言, 开发者不能直接控制程序运行内存, 对象的创建都是...
jvm
1.jvm的简单抽象模型:  2.类加载机制     双亲委派模...
堆外内存JVM启动时分配的内存,称为堆内存,与之相对的,在代...
1.springboot和tomcat2.springcloud的请求如何通过网关鉴权?...