返回顶部
首页 > 资讯 > 后端开发 > JAVA >深入理解java之类加载器
  • 605
分享到

深入理解java之类加载器

java教程java类加载器 2014-12-01 09:12:35 605人浏览 无得
摘要

一、类与类加载器类加载器:实现加载阶段的第一步,通过一个类的全限定名来将这个类的二进制字节流加载进JVM。类与类加载器:任意一个类唯一性都是由它本身和加载它的类加载器确定,两个类是否相等在它们是由同一个类加载器加载的前提下。jvm虚拟机中包

一、类与类加载器

类加载器:实现加载阶段的第一步,通过一个类的全限定名来将这个类的二进制字节流加载进JVM

类与类加载器:任意一个类唯一性都是由它本身和加载它的类加载器确定,两个类是否相等在它们是由同一个类加载器加载的前提下。

jvm虚拟机中包括两种类加载器:一种是启动类加载器(Bootstrap ClassLoader),它是使用c++实现;另一种是其他所有用java实现的类加载器。

从java程序角度:

1)启动类加载器:负责加载lib目录下或者被-Xbootclasspath参数所指定的路径中的类,此外要求文件名被虚拟机识别,如果不被jvm识别也无法被加载。

2)扩展类加载器:负责加载libexit目录下或者被java.exit.dirs系统变量所指定的路径中的所有类库。

3)应用程序类加载器(系统类加载器):它是Classloader中的getSystemClassloader()方法的返回值。负责加载用户类路径上所指定的类库,如果应用程序中没有自定义类加载器,这个就为程序中默认的类加载器。

免费在线视频教学:java视频教程

二、双亲委派模型

37622c085c96e055a28cd7c93bd2a37.png

除了顶层的启动类加载器,其余所有类加载器都有自己的父类加载器。父子关系不以继承实现,而是以组合关系来复用父类加载器。

工作过程: 类加载器接到类加载请求–>将请求委派给父类加载器(直到最顶层启动类加载器)–>父类尝试加载,加载失败反馈给子类加载器–>子类加载器尝试加载

双亲委派模型的好处:保证java底层api的稳定,避免加载和基本类重名(Object)的自定义类导致出现多个不同的重名的类(Object),从而造成Java基础行为的混乱。

双亲委派模型源码:

方法加同步保证线程安全,首先检查该类是否被加载过,如果没有加载则调用父类加载器的loadClass()方法,若父类加载器为空说明是启动类加载器,则调用启动类加载器。

如果父类加载失败会抛出ClassNotFoundException,在调用自己的findClass()方法进行加载。

protected Class loadClass(String name, boolean resolve)
    throws ClassNotFoundException
{
    //同步锁
    synchronized (getClassLoadingLock(name)) {
        // 首先检车这个类是不是已被加载
        Class c = findLoadedClass(name);
        if (c == null) {
            long t0 = System.nanoTime();
            try {
                if (parent != null) {
                    //如果父类不为空则调用父类加载器的loadClass方法
                    c = parent.loadClass(name, false);
                } else {
                    //没有父类则默认调用启动类加载器加载
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                //如果父类加载器找不到这个类则抛出ClassNotFoundException
            }


            if (c == null) {
                // 父类加载器失败时调用自身的findClass方法加载
                long t1 = System.nanoTime();
                c = findClass(name);


                //记录
                sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                sun.misc.PerfCounter.getFindClasses().increment();
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
}

三、破坏双亲委派模型

1.第一次破坏

双亲委派模型出现在jdk1.2之后,而类加载器和抽象类java.lang.ClassLoader已经存在。

因此为了向前兼容,JDK1.2之后在ClassLoader中添加了一个新的protected方法findClass。用户把自己的类加载逻辑写在findClass方法中,而不是重写loadClass方法,从而保证自定义的类加载符合双亲委派模型。

2.第二次破坏

模型自身有缺陷。双亲委派可以确保各个类加载器的基础类的统一,这是在用户代码调用基础类的情况下,如果出现基础类回调用户代码那就不适用了。比如涉及到SPI的场景去加载所需要的SPI代码。

SPI机制的介绍参考其他文章。

为了解决这个问题,引入了线程上下文加载器(Thread Context ClassLoader),这个类加载器就可以通过java.lang.Thread类中的setContextClassLoader()方法进行设置,如果创建线程时未设置将会从父线程中继承一个,如果全局都没有则默认就是应用程序类加载器,利用这个加载器可以完成父类加载器请求子类加载器加载的动作。

3.第三次破坏

由于对程序动态性追求导致,如热部署,热替换等。

比如模块化标准OSGi R4.2中将双亲委派的树形结构变成了更复杂的网状结构。

java文章教程推荐:java入门教程

--结束END--

本文标题: 深入理解java之类加载器

本文链接: https://lsjlt.com/news/3324.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 深入理解java之类加载器
    一、类与类加载器类加载器:实现加载阶段的第一步,通过一个类的全限定名来将这个类的二进制字节流加载进jvm。类与类加载器:任意一个类唯一性都是由它本身和加载它的类加载器确定,两个类是否相等在它们是由同一个类加载器加载的前提下。jvm虚拟机中包...
    99+
    2014-12-01
    java教程 java 类加载器
  • JVM中ClassLoader类加载器的深入理解
    JVM的体系结构图 先来看一下JVM的体系结构,如下图: JVM的位置 JVM的位置,如下图: JVM是运行在操作系统之上的,与硬件没有直接的交互,但是可以调用底层的硬件,用JI...
    99+
    2024-04-02
  • 如何深入理解Java虚拟机JVM类加载初始化
    如何深入理解Java虚拟机JVM类加载初始化,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 Classloader的作用,概括来说就是将编译后的class装载、...
    99+
    2023-06-17
  • 一篇文章带你深入了解Java类加载
    目录1.类加载<1>.父子类执行的顺序<2>类加载的时机<3>类的生命周期<4>类加载的过程<5>类加载器1.启动类加载器...
    99+
    2024-04-02
  • 深入探究Java中的类加载机制
    目录前言步入正题类的加载过程:1.加载2.验证3.准备4.解析5.初始化类加载器源码总结前言 学生时代应抱着问题去学习一门语言,例如:在学习java语言的过程中,我遇到过java主方...
    99+
    2024-04-02
  • require加载器实现原理的深入理解
    前言 我们常说node并不是一门新的编程语言,他只是javascript的运行时,运行时你可以简单地理解为运行javascript的环境。在大多数情况下我们会在浏览器中去运行java...
    99+
    2024-04-02
  • Java反射之深入理解
    目录一、Java反射机制概述二、理解Class类并获取Class实例关于java.lang.Class类的理解三、通过反射创建对应的运行时类的对象(反射的应用1)四、获取运行时类的完...
    99+
    2024-04-02
  • 深入解析Java类加载的案例与实战教程
    目录一、Tomcat类加载器架构二、动态代理的原理三、Java语法糖的改变本篇文章主要介绍Tomcat类加载器架构,以及基于类加载和字节码相关知识,去分析动态代理的原理。 一、Tom...
    99+
    2024-04-02
  • 深入了解Java I/O 之File类
    目录File类创建File文件File文件基本操作总结File类 Java使用File类来表示计算机系统磁盘文件的对象类型。File类中提供了大量的方法,可以对文件进行增加、修改、删...
    99+
    2024-04-02
  • JVM入门之类加载与字节码技术(类加载与类的加载器)
    目录1. 类加载阶段1.1 加载阶段1.2 链接阶段准备1.3 初始化阶段1.4 练习2. 类加载器2.1 启动类加载器2.2 扩展类加载器2.3 双亲委派模式2.4 线程上下文类加...
    99+
    2024-04-02
  • 深入理解java重载和重写
    目录重载1.构造器的重载2.方法的重载(overload)重写区分方法的重载和重写总结重载 1.构造器的重载 因为构造器的名字必须与类名相同,所以同一个类的所有构造器名肯定相同,构成...
    99+
    2024-04-02
  • java类加载器ClassLoader详解
    获得ClassLoader的途径 获得当前类的ClassLoaderclazz.getClassLoader() 获得当前线程上下文的ClassLoaderThread.currentThread().getContextClassLoad...
    99+
    2019-01-28
    java基础 类加载器 ClassLoader
  • Java之类加载机制案例讲解
    1.类加载 <1>.父子类执行的顺序 1.父类的静态变量和静态代码块(书写顺序) 2.子类的静态变量和静态代码块(书写顺序) 3.父类的实例代码块(书写顺序) 4.父类...
    99+
    2024-04-02
  • 深入理解Java嵌套类和内部类
     一、什么是嵌套类及内部类可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌...
    99+
    2023-05-31
    java 嵌套类 内部类
  • Java虚拟机之类加载
    目录一、类加载流程1.1 类加载条件1.2 加载1.3 验证1.4 准备1.5 解析1.6 初始化二、ClassLoader2.1 Class...
    99+
    2024-04-02
  • Java多线程之深入理解ReentrantLock
    目录前言一、可重入锁二、ReentrantLock2.1 ReentrantLock的简单使用2.2 ReentrantLock UML图2.3 lock()方法调用链三、AQS3....
    99+
    2024-04-02
  • 深入理解Java SpringCloud Ribbon 负载均衡
    目录前言1、抛出问题2、源码解析2.1、LoadBalancerIntercepor2.2、LoadBalancerClient2.3、负载均衡策略IRule2.4、总结3、负载均衡...
    99+
    2024-04-02
  • Java基础之自定义类加载器
    目录一、类加载器关系二、基于本地class文件的自定义类加载器三、遇到的问题四、基于网络(url)class文件的自定义类加载器一、类加载器关系 自定义类加载器 创建一个类继承C...
    99+
    2024-04-02
  • Java反射的深入探索:掌握类加载的奥秘
    Reflection,也被称为Java反射,允许您在运行时检查和修改类的属性、方法和构造函数。虽然在Java开发中理解Reflection非常重要,但它也很复杂。在本文中,我们将深入探讨Reflection,帮助您理解它的工作原理并掌握其...
    99+
    2024-02-09
    Java反射 类加载 动态代理 Java虚拟机
  • 怎么解析Java类加载器
    这篇文章给大家介绍怎么解析Java类加载器,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Jav...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作