Java高级篇——深入浅出Java类加载机制

转载自 Java高级篇——深入浅出Java类加载机制

类加载器


简单讲,类加载器ClassLoader的功能就是负责将class文件加载到jvm内存。


类加载器分类


从虚拟机层面讲分为两大类型的类加载器,一是Bootstrap Classloader即启动类加载器(C++实现),它是虚拟机的一部分,二是其他类型类加载器(JAVA实现),在虚拟机外部,并全部继承ClassLoader类。


从细分的角度讲会分为以下三类类加载器:


1、Bootsrap ClassLoader


启动类加载器,完全由jvm控制加载,外面访问不到这个类加载器,即不能被java程序引用。它主要负责加载jvm自身的工作类,即java/lib目录和-Xbootclasspath参数指定的目录的类库。


2、Extension ClassLoader


扩展类加载器,由java实现,即ExtClassLoader实现类。它主要负责加载java/lib/ext目录和系统环境变量java.ext.dirs指定目录所有类库。


3、Application ClassLoader


应用程序类加载器,由java实现,即AppClassLoader实现类。它的父类是ExtClassLoader,它主要负责加载classpath目录上的类库。如果没有自定义ClassLoader,它就是程序中默认的ClassLoader,即可以通过ClassLoader.getSystemClassLoader()获取当前系统的类加载器。



从上图看虽然Bootstrap ClassLoader是最顶层的类加载器,但是不能被程序引用,它也不是ExtClassLoader的父类加载器,ExtClassLoader没有父类载器,我们不防来看下面简单的例子。


程序首先输出了程序默认的类加载器AppClassLoader,然后再输出了其父类加载器ExtClassLoader,然后就完了,这就证实了上面的理论。


类加载机制


虽然定义了上面这几个类加载器,但在加载时类加载器会审查一个class类应该由哪个类型的加载器负责加载,它使用的是等级加载机制,是一种双亲委派模型。


双亲委派模式要求所有类加载器,除了顶层的Bootstrap类加载器之外都要有自己的父类加载器。在收到一个类加载请求时,当前默认的类加载器它不会首先自己来加载这个类,它会委托给自己的父类加载器去加载,父类加载器再委托给父父类加载器,以此类推,直到顶层类加载器,由上到下加载,除非上面的类加载器都无法加载时自己才去加载。


来看看ClassLoader.loadClass方法源码



再回到之前文章中的有一道关于是否可以自定义类java.lang.String并使用的面试题,它在java/lib目录下,所以当应用类加载器去classpath加载时会去委托父类加载器,这时最顶层类加载器会发现自己之前已经加载过,所以这次不再加载,所以自定义的这个java.lang.String虽然可以正常编译,但不能被类加载器加载并使用。


所以,这也是双亲委派模式的好处,同一个路径的类保证不能加载两次,保证了类与类之间的正常行为和正常运行。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

康复题21

For a positive integer n lets define a function f: f(n)   - 1  2 - 3  ..  ( - 1)nn Your task is to calculate f(n) for a given integer n. Input The single line contains the positive integer n (1 ≤ n ≤ 1015). Output Print f(n) in a …

转: databasemetadata 无法获取数据库表备注的解决方法

转自: https://blog.csdn.net/10km/article/details/77389038 mysql/jdbc:设置useInformationSchematrue读取表注释信息(table_comment) 问题描述 今天在读取表的注释信息(COMMENT)时,发现返回的REMARKS字段返回居然是null. 以下是代码示例: DatabaseMetaData me…

IntegerCache的妙用和陷阱

转载自 IntegerCache的妙用和陷阱 考虑下面的小程序,你认为会输出为什么结果? public class Test {public static void main(String[] args) {Integer n1 123;Integer n2 123;Integer n3 128;Integer n4 128;System.out.println(n1 n2);System.ou…

转:线性代数知识汇总

https://blog.csdn.net/MyArrow/article/details/53365048 1. 线性代数知识图谱 线性代数是代数学的一个分支,主要处理线性关系问题。线性关系意即数学对象之间的关系是以一次形式来表达的。例如,在解析几何里,平面上直线的方程是二元一次…

康复题25

都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马…

2020-09-17

https://www.zhihu.com/question/32729130

高级JAVA码农必须搞清楚它们的区别:instanceof、isInstance、isAssignableFrom

转载自 高级JAVA码农必须搞清楚它们的区别:instanceof、isInstance、isAssignableFrominstanceof、isInstance、isAssignableFrom这几个有没有接触过,或者接触过部分?定义a instanceof B a是B的实例,B是类或者接口、父类或父接口&…

康复题12

An elephant decided to visit his friend. It turned out that the elephants house is located at point 0 and his friends house is located at point x(x > 0) of the coordinate line. In one step the elephant can move 1, 2, 3, 4 or 5 positions forward. Deter…

Java架构师必看的10本书

转载自 Java架构师必看的10本书1、大型网站系统与JAVA中间件实践 本书围绕大型网站和支撑大型网站架构的Java中间件的实践展开介绍。 从分布式系统的知识切入,让读者对分布式系统有基本的了解;然后介绍大型网站随着数据量、访问量增长而发生的架构变迁&a…

转: Spark 的核心概念 RDD

转自: https://juejin.im/post/6844903826953076750 1.RDD 概述 1.1 什么是 RDD ? RDD(Resilient Distributed Dataset) 叫着 弹性分布式数据集 ,是Spark 中最基本的抽象,它代表一个不可变、可分区、里面元素可以并行计算的集合。 RDD …

SpringMVC @Transactional的陷井大坑引发No Session found for current thread

一、TransactionManager事务配置 &#xff08;1&#xff09;注解配置 配置spring的xml加Transactional<tx:annotation-driven transaction-manager"transactionManager" proxy-target-class"true" /> &#xff08;2&#xff09;xml配置 <tx:adv…

POJ3904(BFS算法)

Problem Descrption Promble Description 定义一个二维数组&#xff1a; int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&…

转:SparkConf 配置的用法

Spark应用程序的配置&#xff0c;用于将各种Spark参数设置为键值对。 大多数情况下&#xff0c;将使用新的SparkConf(),创建一个SparkConf对象&#xff0c;该对象将从您的应用程序中设置的任何spark.*的Java系统属性加载值。 在这种情况下&#xff0c;** 直接在SparkConf对象上…

Spring MVC 基于URL的拦截和映射规则

转载自 Spring MVC 基于URL的映射规则&#xff08;注解版&#xff09; url-pattern 如果看过前一篇入门的帖子&#xff0c;应该了解到spring mvc在启动前必须要在web.xml中配置servlet&#xff0c;这样才能拦截到想要映射的url地址。 <servlet><servlet-name>Spr…

转自: SparkConf 配置的概念和用法

一&#xff1a;概念 Spark应用程序的配置&#xff0c;用于将各种Spark参数设置为键值对。 大多数情况下&#xff0c;将使用新的SparkConf(),创建一个SparkConf对象&#xff0c;该对象将从您的应用程序中设置的任何spark.的Java系统属性加载值。 在这种情况下&#xff0c;* 直接…

HDU1231(最大连续子序列)

给定K个整数的序列{ N1, N2, ..., NK }&#xff0c;其任意连续子序列可表示为{ Ni, Ni1, ..., Nj }&#xff0c;其中 1 < i < j < K。最大连续子序列是所有连续子序列中元素和最大的一个&#xff0c; 例如给定序列{ -2, 11, -4, 13, -5, -2 }&#xff0c;其最大连续子…

漫画:什么是人工智能

转载自 漫画&#xff1a;什么是人工智能什么是人工智能&#xff1f;人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI&#xff0c;它是研究、开发用于模拟和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。上个世纪50年代一次…

(精华)转:RDD:创建的几种方式(scala和java)

转&#xff1a; https://blog.csdn.net/weixin_38750084/article/details/82769600 这篇文章非常棒&#xff0c; 用代码实际演示了如何创建RDD&#xff1b; 本文主要转载了 java创建RDD的两种方式&#xff0c; 【方式1】 下面开始初始化spark spark程序需要做的第一件事情&…

POJ3278(BFS入门)

Problem Descrption Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Far…

漫画:什么是架构师

转载自 什么是架构师&#xff1f; 架构师英文architect&#xff0c;这个词源于建筑学。软件工程当中的架构师和建筑工程当中建筑师有许多相通之处&#xff0c;都是负责“产品”宏观的架构设计。在一个团队里&#xff0c;架构师充当了技术Leader的角色&#xff0c;不仅要完成项目…