JVM 初体验 类加载器自定义与打破双亲委派机制

本文介绍了JVM类加载器的工作原理,特别是双亲委派机制,通过类加载器的层次结构和loadClass与findClass方法的递归使用进行详细阐述。接着讲解如何自定义ClassLoader,包括新建子类、转换字节码为Class实例以及调用loadClass方法。最后探讨了如何打破双亲委派机制,通过重写loadClass方法实现特定的类加载需求。
摘要由CSDN通过智能技术生成

类加载器分三步来理解

1.基本原理 双亲委派机制

JVM类加载器是有亲子层级结构的,如下图 这里类加载其实就有一个双亲委派机制,加载某个类时会先委托父加载器寻找目标类,找不到再 委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的 类加载路径中查找并载入目标类。 比如我们的Math类,最先会找应用程序类加载器加载,应用程序类加载器会先委托扩展类加载 器加载,扩展类加载器再委托引导类加载器,顶层引导类加载器在自己的类加载路径里找了半天 没找到Math类,则向下退回加载Math类的请求,扩展类加载器收到回复就自己加载,在自己的 类加载路径里找了半天也没找到Math类,又向下退回Math类的加载请求给应用程序类加载器, 应用程序类加载器于是在自己的类加载路径里找Math类,结果找到了就自己加载了。。 双亲委派机制说简单点就是,先找父亲加载,不行再由儿子自己加载


/**
 * @Author: xzc
 * @Date: 2021/8/11 3:07
 * @Version 1.0
 */
public class TestJDKClassLoader {
    /**
     * 拿默认方法的类加载器 发现为空 因为这是c++的
     * 拿自定义类加载器发现在父方法上
     * 拿
     */
    @Test
    public void main01() {
        String ss = new String("ss xxzc");
        System.out.println(ss);
        System.out.println(String.class.getClassLoader());
        System.out.println(com.xzc.jvm.jvm01.Math.class.getClassLoader());

        ClassLoader appClassLoader = Math.class.getClassLoader();
//        ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println("appClassLoader  " +appClassLoader);
        ClassLoader extClassLoader = appClassLoader.getParent();
        System.out.println("extClassLoader  " +extClassLoader);
        ClassLoader bootStrapClassLoader = extClassLoader.getParent();
        System.out.println("bootStrapClassLoader  " +bootStrapClassLoader);

        System.out.println("\n bootstrapLoader 加载以下文件:\n");
//        URLClassPath bootstrapClassPath = Launcher.getBootstrapClassPath();
        this.getURLs(Launcher.getBootstrapClassPath());
        System.out.println("\n extClassLoader 加载以下文件:\n");
        System.out.println(System.getProperty("java.ext.dirs"));

        System.out.println("\n appClassLoader 加载以下文件:\n");

        String property = System.getProperty("java.class.path");
        String[] strings = property.split(";");
        getappClassLoaderURLs(strings);
//        System.out.println(strings);
//        System.out.println(System.getProperty("java.class.path"));

    }

    public void getappClassLoaderURLs(String[] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值