• java类加载器与双亲委派机制详解


    1. java类加载过程

    类加载器java.lang.ClassLoader:

    负责查找、加载、校验字节码的应用程序

    • load(String className) 根据名字加载一个类,返回类的实例
    • defineClass(String name, byte[] b, int off, int len) 将一个字节流定义一个类
    • findClass(String name) 查找一个类
    • findLoadedClass(String name) 在已加载的类中,查找一个类
    • 成员变量 ClassLoader parent;

    JVM四级类加载器:

    • 启动类加载器(Bootstrap),C语言编写,负责加载核心Java Class
    • 扩展类加载器(Extension),jre/lib/ext
    • 应用类加载器(App),classpath
    • 用户自定义加载器(Plugin),程序自定义,通过继承ClassLoader父类来创建自己的类加载器

    2. 双亲委托模型

    protected Class<?> loadClass(String name, boolean resolve)
            throws ClassNotFoundException
        {
            synchronized (getClassLoadingLock(name)) {
                // First, check if the class has already been loaded
                Class<?> c = findLoadedClass(name);//首先查找这个类是否被加载
                if (c == null) {
                    if (parent != null) {
                        c = parent.loadClass(name, false);//调用他的父加载器进行类加载,进行递归调用
                    } else {
                        c = findBootstrapClassOrNull(name);//由bootStrap类加载
                    }
    
                    if (c == null) {
                        // If still not found, then invoke findClass in order
                        // to find the class.
                        long t1 = System.nanoTime();
                        c = findClass(name);//查找自己的类加载器能否加载此类,如果有则加载,给c赋值,c不为空,所以结束各层的调用
    
                    }
                }
                if (resolve) {
                    resolveClass(c);
                }
                return c;
            }
        }
    

  • 相关阅读:
    后端结对编程报告(2018.6.6)
    Burn Down Chart(2018.6.4~2018.6.10)
    C#多线程List的非线程安全性
    C#泛型参数多线程与复杂参数多线程
    Java学习之App开发公司手机端设想
    Java学习之SpringBoot整合SSM Demo
    Java学习之Mysql结构优化
    Java学习之Dubbo+ZooKeeper分布式服务Demo
    C# 面向切面编程--监控日志记录方案
    C# 通用类型转换方法
  • 原文地址:https://www.cnblogs.com/innndown/p/12372562.html
Copyright © 2020-2023  润新知