zoukankan      html  css  js  c++  java
  • 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;
            }
        }
    

  • 相关阅读:
    李洪强九宫格的实现
    iOS开发多线程篇 11 —自定义NSOperation
    CALayer3-层的属性
    网络编程小结
    iOS开发多线程篇 10 —NSOperation基本操作
    CALayer2-创建新的层
    iOS开发之多文件上传
    三级联动
    用 ERD 盘解决 Win8 自己主动更新后不能启动的问题
    hdu1028(母函数+DP)
  • 原文地址:https://www.cnblogs.com/innndown/p/12372562.html
Copyright © 2011-2022 走看看