用户自定义类加载器探秘

用户自定义类加载器探秘

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
深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器

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

文章更新历史

2022/05/05 feat:初稿。

类加载器(ClassLoader

JVM 提供了三种类加载器

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

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

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


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