面试题思考:其实类加载器的加载机制很简单

针对类加载器的分类与说明

一.类加载器的分类:

1.系统提供的类加载器

1.BootStarp(引导类加载器):负责加载java核心类库,不继承自ClassLoader加载器;

2.Extension(扩展类加载器):负责加载java扩展库(例如sun公司专门为连接数据库设计的JDBC的一组API)

3.Application(系统类加载器): 负责加载普通用户编写的java应用类

备注:1.BootStrap加载器是由原生代码(C++)编写而成的,因此不继承自ClassLoader加载器,其他的类加载都必须继承自    ClassLoader加载器

2.以上三个加载器是从表面理念上来说是父子关系,但事实并非继承关系,而是组合的关系

2.自定义类加载器:必须继承自ClassLoader加载器

例如:Tomcat里面的web加载器

二.类加载器内部加载机制的分类:

1.J2SE:采用的是全盘委托机制(也称双亲委派机制)

机制:双亲委派机制

结构:.树状结构

备注:加载一个类的时候:自下而上检查,在上而下加载,双亲委派机制保证了核心库的类型安全

2.J2EE:

1.在Tomcat中 抛弃了双亲委派机制,而是自定义了web加载器,采用的也是代理模式,在加载一个类的时候:自下而上检查,自下而上加载

2.每个文本应用项目都对应自己独立的一个web类加载器

备注:同一个类被不同的类加载加载,JVM也认为是不同的类

三.由于java编程的设计思想是面向接口编程,

接口+实现

1.sun公司都是某个功能的设计者:SPI接口   sun公司自己设计的接口属于核心库,必须由BootStrap类加载器加载

2.其他公司才是这个功能的实现者:SPI实现类   实现公司写的实现类属于普通java应用类,必须由Application类加载加载

备注:由于双亲委派机制一般都设计为同一个类中所关联的其他类都要让当前类的加载器加载,所以和上面的这种设计理念又发生了冲突,所以提出了

线程上下文类加载器的概念,果断抛弃了双亲委派机制,让其同时加载接口和实现类

代码:Thread.currentThread().setClassLoader(自定义类加载器); 自定义加载器就可以随意改为自己的加载模式了

四.OSGI(Open Service Gateway Initative)面向java的动态模块的系统

OSGi旨在为实现Java程序的模块化编程提供基础条件,基于OSGi的程序很可能可以实现模块级的热插拔功能,当程序升级更新时,可以只停用、重新安装然后启动程序的其中一部分,这对企业级程序开发来说是非常具有诱惑力的特性。

OSGi描绘了一个很美好的模块化开发目标,而且定义了实现这个目标的所需要服务与架构,同时也有成熟的框架进行实现支持。但并非所有的应用都适合采用OSGi作为基础架构,它在提供强大功能同时,也引入了额外的复杂度,因为它不遵守了类加载的双亲委托模型。

原文地址:https://www.cnblogs.com/songanwei/p/9417277.html

时间: 2024-07-31 12:07:21

面试题思考:其实类加载器的加载机制很简单的相关文章

Java 类加载器及加载Class字节码

参考来源:http://www.cnblogs.com/fingerboy/p/5456371.html       java笔记--理解java类加载器以及ClassLoader类 参考来源:http://blog.csdn.net/shareus/article/details/52422788    Java 类加载器及加载Class字节码

扩展类加载器的加载问题

我们都知道java的类载入器共有三级,分别是bootstrap (引导类)加载器.extension(扩展类)加载器和 system (系统类)加载器.这三个加载器是父子关系,其中 bootstrap 类加载器在顶端,而 system 加载器在结构的最底层.同时他们都采取向上传递的机制,即有了要加载的类,先问问自己的父加载器,若父加载器不能加载,自己再加载. 我们写了一个helloworld类,加载的时候,二进制字节码送给系统类加载器,但是系统类会询问它的父加载器(扩展类)你能加载不?扩展类加载

Java重要技术(28)类加载器之类加载器的层次关系和委托加载机制

1.1. 类加载器的层次 类加载器包括三种: Bootstrap ClassLoader:用于加载JRE的lib目录下的jar文件中的class. ExtClassLoader:用于加载JRE的lib/ext目录下的jar文件中的class. AppClassLoader:用于加载classpath下的class. 在加载一个class时,通常应该先委托给parent类加载器来加载,parent类加载器找不到这个类时,才自行加载.实际优先次序从高到低排列是BootStrap ClassLoade

JAVA-类加载机制(3)-类加载器

类加载器 作用:通过类全限定名来获取二进制字节流 用例:类层次划分,OSGi,热部署,代码加密 1,类和类加载器 任意一个类和加载该类的加载器一同确立在虚拟机中的唯一性: 每个类拥有独立的类名称空间: 判断两个类是否相等,必须建立在同一个类加载器加载的前提下:否则会影响:equals, isAssignableFrom, isInstance, instanceof结果 package com.classload.temp; import java.io.IOException; import

类的加载机制和反噬——二、类加载器

类加载器 1.类加载器简介 (1)类加载器负责加载所有的类,系统为所有被载入内存中的类生成一个java.lang.Class实例: (2)一旦一个类被载入JVM中,同一个类就不会被再次载入了: (3)同一个类的标准:在JVM中用全限定名和类加载器作为其唯一标识: (4)JVM启动时,形成的三个类加载器组成的初始类加载器层次结构: 1)BootStrap ClassLoader:根类加载器: 2)Extension ClassLoader:拓展类加载器: 3)System ClassLoader:

Java 理解类加载过程 -- 自定义加载器

类加载器可以看下我的收藏: https://www.cnblogs.com/dongguacai/p/5879931.html 现在准备一个字节码文件: 自定义加载器: 1 package com.xzlf.test; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.FileInputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 8

双亲委派模型,类的加载机制,搞定大厂高频面试题

看过这篇文章,大厂面试你「双亲委派模型」,硬气的说一句,你怕啥? 读该文章姿势 打开手头的 IDE,按照文章内容及思路进行代码跟踪与思考 手头没有 IDE,先收藏,回头看 (万一哪次面试问了呢) 需要查看和拷贝代码,点击文章末尾出「阅读原文」 文章内容相对较长,所以添加了目录,如果你希望对 Java 的类加载过程有个更深入的了解,同时增加自己的面试技能点,请耐心读完...... 双亲委派模型 在介绍这个Java技术点之前,先试着思考以下几个问题: 为什么我们不能定义同名的 String 的 ja

深入JVM系列(三)之类加载、类加载器、双亲委派机制与常见问题

一.概述 定义:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型.类加载和连接的过程都是在运行期间完成的. 二. 类的加载方式 1):本地编译好的class中直接加载 2):网络加载:java.net.URLClassLoader可以加载url指定的类 3):从jar.zip等等压缩文件加载类,自动解析jar文件找到class文件去加载util类 4):从java源代码文件动态编译成为class文件 三.类加载的时机

Java虚拟机JVM学习05 类加载器的父委托机制

Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap) 扩展类加载器(Extension) 系统类加载器(System) 2.用户自定义的类加载器: java.lang.ClassLoader的子类,用户可以定制类的加载方式. JVM自带的加载器 Java虚拟机自带了以下几种加载器. 1.根(Bootstrap)类加载器: 该加载器没有父加载器. 它