zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    【LeetCode-位运算】位1的个数
    【LeetCode-数组】调整数组顺序使奇数位于偶数前面
    mySQL数据库中.frm和.myi和.myd和.ibd文件是什么文件?
    安装docker-compose的两种方式
    将第三方jar包 安装到 maven仓库
    limit分页查询
    pom.xml配置指定仓库
    linux常用命令
    正则笔记
    使用conda创建虚拟环境
  • 原文地址:https://www.cnblogs.com/sicheng-li/p/12952954.html
Copyright © 2011-2022 走看看