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;
    
            }
    
        }

     

  • 相关阅读:
    Quartz.Net进阶之一:初识Job作业和触发器
    Sql Server 三个很有用的函数
    Quartz.NET快速入门指南
    VS2015 提示 无法启动 IIS Express Web 服务器
    sql like 另一个表的字段
    Python3快速入门--Python多线程编程
    seo-网站变化百度搜索引擎的影响
    Asp.NetCore 3.1 EFCore处理Mysql的分库分表--MyCat解决方案
    asp.net core 3.1里 EF的事务-代码示例
    Asp.netCore3.1 Blazor入门
  • 原文地址:https://www.cnblogs.com/barneywill/p/10111633.html
Copyright © 2011-2022 走看看