用户自定义类加载器探秘

用户自定义类加载器探秘

MyClassLoader

/**
 * 自定义类加载器
 *
 * @name: MyClassLoader
 * @author: terwer
 * @date: 2022-07-07 21:37
 **/
public class MyClassLoader extends ClassLoader {
    //  类加载器的名字
    private String name;

    // 加载类的路径
    private String path = "/home/terwer/Downloads";

    // class文件的扩展名
    private final String fileType = ".class";

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public MyClassLoader(String name) {
        // 让系统类加载器成为类加载器的父类加载器
        super();
        this.name = name;
    }

    public MyClassLoader(ClassLoader parent, String name) {
        // 显式指定类的父类加载器
        super(parent);
        this.name = name;
    }

    @Override
    public String toString() {
        return this.name;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        byte[] data = this.loadClassData(name);

        return this.defineClass(name, data, 0, data.length);
    }

    private byte[] loadClassData(String name) {
        InputStream is = null;
        byte[] data = null;
        ByteArrayOutputStream baos = null;

        try {
            this.name = this.name.replace(".", "/");
            is = new FileInputStream(path + "/" + name + fileType);

            baos = new ByteArrayOutputStream();

            int ch = 0;
            while (-1 != (ch = is.read())) {
                baos.write(ch);
            }

            data = baos.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (is != null) {
                    is.close();
                }
                if (baos != null) {
                    baos.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }

        return data;
    }
}

Terwer...大约 1 分钟JVM新思路新笔记jvmclassloadercustom
类加载器的父亲委托机制深度详解

类加载器的父亲委托机制深度详解

类加载器

image-20220706194726101
image-20220706194726101

类加载器的父亲委托机制

类加载器的父亲委托机制(Parent Delegation)

父子加载器不是继承关系,子加载器不一定要继承父加载器。


Terwer...大约 1 分钟JVM新思路新笔记jvmclassloaderparentdelegate
类加载器深入解析与阶段分解

类加载器深入解析与阶段分解

类加载

  • 在Java代码中,类型的加载、链接与初始化都是在程序运行期间完成的
  • 提供了更大的灵活性,增加了更多的可能性

加载:例如从磁盘把class文件加载到jvm

链接:确定类与类之间的关系,字节码的安全校验等

初始化:为静态变量赋值

类加载器深入剖析

  • Java虚拟机与生命周期
  • 在如下情况下,Java虚拟机将结束生命周期
    • 执行了 System.exit() 方法
    • 程序正常执行结束
    • 程序在运行过程中遇到了异常或者错误而异常终止
    • 由于操作系统出现了错误导致Java虚拟机进程退出

Terwer...大约 1 分钟新笔记JVM进阶新思路jvm
Java字节码文件结构剖析

Java字节码文件结构剖析

javap

javap MyTest1

image-20220605211957751
image-20220605211957751

javap -c MyTest1

image-20220605212012796
image-20220605212012796

Terwer...大约 2 分钟新笔记JVM进阶新思路jvm
JVM知识体系与工具使用

JVM知识体系与工具使用

基于JVM的动态语言和静态语言生态圈很繁荣

大纲

  • JVM介绍
  • HotSpot虚拟机讲解
  • 垃圾收集方式详解
  • 垃圾收集算法详解
  • 垃圾收集器详解
  • 分代垃圾收集机制详解
  • 新生代讲解
  • 老年代讲解
  • G1收集器分析与实例
  • 常见且重要的虚拟机参数实例
  • 方法区
  • 线程共享内存区
  • 根搜索算法
  • Serial收集器
  • ParNew收集器
  • 类加载机制详解
  • 类加载的双亲委托机制
  • 字节码文件生成与分析
  • 魔数
  • 常量池与方发表
  • 各种指令详解
  • 锁详解
  • 线程安全
  • 偏向锁、自旋锁与轻量级锁
  • JIT编译器
  • GC日志生成与分析
  • 虚拟机监控工具详解
  • jconsole使用方式详解
  • 逃逸与逃逸分析
  • 方法内联
  • 虚拟机内存模型详解

Terwer...小于 1 分钟新笔记JVM进阶新思路jvm
深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器

深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器

文章更新历史

2022/05/05 feat:初稿。

类加载器(ClassLoader

JVM 提供了三种类加载器

  • 根类加载器(使用 C++ 编写,程序员无法在 Java 代码中使用他们

  • 扩展类加载器(使用 Java 代码实现)

  • 应用类加载器(系统加载器),使用 Java 实现


Terwer...大约 5 分钟JVM新思路新笔记jvmclassclassloader
2