资讯专栏INFORMATION COLUMN

双亲委派模型

MockingBird / 3031人阅读

摘要:类加载流程类加载流程,先加载启动类加载即最顶层的加载类。继续再次加载扩展类加载器由加载,加载进入内存。即,如果需要将当前类加载进入,那么就需要重写方法,若未找到这几种类,则会自动调用方法。调用该方法调用类中的,参数为空的方法。

类加载流程

类加载流程,先加载Bootstrap ClassLoader 启动类加载即最顶层的加载类。这部分由C++ 编写。
继续再次加载Extention ClassLoader 扩展类加载器由Bootstrap ClassLoader加载,加载进入内存。
继续再次加载Application ClassLoader 应用类加载器,即系统即在此,加载当前应用下的类
最后再次加载ClassLoader类

双亲委派模型

该模型是先检查指定名称的类是否已经加载过,如果加载进入内存,不加载直接返回,如果没有加载过,判断是否有父类加载器,如果拥有父类加载器,那么将会直接将权利移交给父类,由父类代理当前类进行加载该类。或者是调用C++的bootstrap类加载器来加载该类
最后如果三者都没有找到类,那么直接调用当前类加载器的findClass方法来完成类加载。
即,如果需要需要加载自定义的类,那么就需要重写findClass方法。

即,如果需要将当前类加载进入,那么就需要重写findClass方法,若未找到这几种类,则会自动调用findClass方法。
调用过程

先加载父类,若父类未加载,继续调用父类,直到bootstrap查看是否已经加载,如果此时都未加载类,那么将会使用自定义的ClassLoader 然后调用自定义的ClassLoader的findClass方法,用于将字节码加载进入内存。最后返回该class的描述符

栗子
public class Test {
    public void helloWorld(){
        System.out.println("me loader" + getClass().getClassLoader().getClass());
        // 先调用getClass获取当前类的对象的描述,然后再次调用getClassLoader()获取加载的父类,再次调用getClass()获取加载进入的父类的名称
    }
}

此时如果该类这这个项目里的里的话,会由Application加载当前应用类下的类。

由类的加载过程可知,当未找到类的时候,会加载类的ClassLoader类,此时需要定义一个类,让该类继承ClassLoader类,由于该类是ClassLoader的子类,此时会自动加载该类,由于该类不在内存当中,所以需要使用static,让其一开始加载进入内存当中。
代码如下

import java.io.FileInputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Main {
    // 需要使用static让其加载进入内存
    static class myClassLoader extends ClassLoader{
        private String classPath;  // 获取当前类的在磁盘中保存的地址
        // 通过构造函数将地址注入
        public myClassLoader(String classPath){
            this.classPath = classPath;
        }
        // 将文件内容加载进入内存
        private byte[] loadByte(String name) throws Exception{
            // 获取一个输入流,
            FileInputStream fis = new FileInputStream(classPath + "/" + name + ".class");
            // 获取长度
            int len = fis.available();
            // 定义byte数组
            byte[] data = new byte[len];
            // 加载进入内存
            fis.read(data);
            // 关闭流
            fis.close();
            return data;
        }
        // 重写findClass方法,让加载的时候调用findClass方法
        protected Class findClass(String name) throws ClassNotFoundException{
            try{
                // 读取文件到数组中
                byte[] data = loadByte(name);
                // 将字节码加载进入内存当中
                return defineClass(name, data, 0, data.length);
            }catch(Exception e){
                e.printStackTrace();
            }
            return null;
        }
    }
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException, ClassNotFoundException {
        // 先初始化该类
        myClassLoader classLoader = new myClassLoader("/home/ming");
        // 此时会调用findClass加载Test.class加载进入内存当中
        Class clazz = classLoader.loadClass("Test");
        // 实例化该类对象
        Object obj = clazz.newInstance();
        // 获取clazz该类方法中名称为hello,参数为空的方法。
        Method helloMethod = clazz.getDeclaredMethod("helloWorld", null);
       // 调用该方法
        // 调用obj类中的helloMethod,参数为空的方法。
       helloMethod.invoke(obj, null);

    }
}

实验结果

me loaderclass Main$myClassLoader

Process finished with exit code 0

https://www.iming.info/shuang...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73125.html

相关文章

  • JVM类加载过程 & 双亲委派模型

    摘要:类加载过程双亲委派模型声明文章均为本人技术笔记,转载请注明出处类加载过程类加载机制将类描述数据从文件中加载到内存,并对数据进行,解析和初始化,最终形成被直接使用的类型。深入理解虚拟机高级特性与最佳实践加载加载阶段由类加载器负责,过程见类加载 JVM类加载过程 & 双亲委派模型 声明 文章均为本人技术笔记,转载请注明出处https://segmentfault.com/u/yzwall ...

    happen 评论0 收藏0
  • Java类加载机制之双亲委派模型

    摘要:比如我们要加载类,无论我们用哪个类加载器去加载类,这个加载请求最终都会委托给,这样就保证了所有加载器加载的类都是同一个类。如果没有双亲委派模型,那就乱了套了,完全可能搞出多个不同的类。 前言 双亲委派模型是Java加载类的机制.采用双亲委派模型的好处是Java类随着它的类加载器一起具备了一种带有优先级的层级关系,通过这种层级关系可以避免类的重复加载. 1. 模型基础 showImg(h...

    X_AirDu 评论0 收藏0
  • Java的类加载机制

    摘要:如果需要支持类的动态加载或需要对编译后的字节码文件进行解密操作等,就需要与类加载器打交道了。双亲委派模型,双亲委派模型,约定类加载器的加载机制。任何之类的字节码都无法调用方法,因为该方法只能在类加载的过程中由调用。 jvm系列 垃圾回收基础 JVM的编译策略 GC的三大基础算法 GC的三大高级算法 GC策略的评价指标 JVM信息查看 GC通用日志解读 jvm的card table数据...

    aervon 评论0 收藏0
  • 类加载器以及双亲委派模型

    摘要:宗主引导类加载器。双亲委派模型是如何使用的我们在自定义加载器中查找是否有需要加载的文件,如果已经加载过,直接返回字节码。 作者:毕来生微信:878799579 1、小故事理解类加载器以及双亲委派模型 首先我们来描述一个小说场景,通过这个场景在去理解我们相关的类加载器的执行以及双亲委派模型。 上古时代有逍遥派和万魔宗两个宗派,互相对立。逍遥派比万魔门更加强势。巅峰战力更高。 有一天万魔宗...

    曹金海 评论0 收藏0
  • 虚拟机类加载机制

    摘要:虚拟机为了保证一个类的方法在多线程环境中被正确地加锁同步。但启动类加载器不可能认识这些代码。实现模块化热部署的关键则是它的自定义类加载器机制的实现。 概念区分:加载、类加载、类加载器 类加载是一个过程。 加载(Loading)是类加载这一个过程的阶段。 类加载器是ClassLoader类或其子类。 本文中的类的描述都包括了类和接口的可能性,因为每个Class文件都有可能代表J...

    airborne007 评论0 收藏0
  • JVM如何加载一个类的过程,双亲委派模型中有哪些方法?

    摘要:双亲委派模型中方法双亲委派是指如果一个类收到了类加载的请求,不会自己先尝试加载,先找父类加载器去完成。当顶层启动类加载器表示无法加载这个类的时候,子类才会尝试自己去加载。 类加载过程:加载、验证(验证阶段作用是保证Class文件的字节流包含的信息符合JVM规范,不会给JVM造成危害)、准备(准备阶段为变量分配内存并设置类变量的初始化)、解析(解析过程是将常量池内的符号引用替换成直接引用...

    shadajin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<