zoukankan      html  css  js  c++  java
  • 【原创】Java基础之ClassLoader类加载器简介

    classloader简介

    1 classloader层次结构(父子关系)

    Bootstrap(ClassLoader)

    • ExtClassLoader
      • AppClassLoader
        • XXXClassLoader

    详见代码如下:

    sun.misc.Launcher
    public Launcher() {
    
            Launcher.ExtClassLoader var1;
    
            try {
    
                var1 = Launcher.ExtClassLoader.getExtClassLoader();
    
            } catch (IOException var10) {
    
                throw new InternalError("Could not create extension class loader", var10);
    
            }
    
     
    
            try {
    
                this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
    
            } catch (IOException var9) {
    
                throw new InternalError("Could not create application class loader", var9);
    
            }

    2 classloader加载类过程

    classloader在加载class时优先尝试通过parent classloader加载,如果加载不到,才尝试自己加载,即常说的“双亲委派”,

    并且如果一个class依赖其他class,比如ClassA依赖ClassB,ClassB默认由ClassA的classloader来加载。

    * <p> The methods and constructors of objects created by a class loader may
    * reference other classes. To determine the class(es) referred to, the Java
    * virtual machine invokes the {@link #loadClass <tt>loadClass</tt>} method of
    * the class loader that originally created the class.

    详见代码如下:

    java.lang.ClassLoader
    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) {
    
                    long t0 = System.nanoTime();
    
                    try {
    
                        if (parent != null) {
    
                            c = parent.loadClass(name, false);
    
                        } else {
    
                            c = findBootstrapClassOrNull(name);
    
                        }
    
                    } catch (ClassNotFoundException e) {
    
                        // ClassNotFoundException thrown if class not found
    
                        // from the non-null parent class loader
    
                    }
    
     
    
                    if (c == null) {
    
                        // If still not found, then invoke findClass in order
    
                        // to find the class.
    
                        long t1 = System.nanoTime();
    
                        c = findClass(name);
    
     
    
                        // this is the defining class loader; record the stats
    
                        sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
    
                        sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
    
                        sun.misc.PerfCounter.getFindClasses().increment();
    
                    }
    
                }
    
                if (resolve) {
    
                    resolveClass(c);
    
                }
    
                return c;
    
            }
    
        }

     

  • 相关阅读:
    Video Test Pattern Generator(7.0)软件调试记录
    阅读<Video Test Pattern Generator v7.0>笔记
    阅读<Vivado Design Suite Tutorial---Logic Simulation>笔记
    Modelsim使用流程---基于TCL命令的仿真
    BT.656 NTSC制式彩条生成模块(verilog)
    Video to SDI Tx Bridge模块video_data(SD-SDI)处理过程
    时钟分频方法---verilog代码
    手动按键复位程序(包含按键消抖)
    使用Vivado进行行为级仿真
    阅读OReilly.Web.Scraping.with.Python.2015.6笔记---Crawl
  • 原文地址:https://www.cnblogs.com/barneywill/p/10111633.html
Copyright © 2011-2022 走看看