题目:Java的类加载器有哪些;每个类加载器都加载哪些类;这些类加载之间的父子关系是怎样的;什么是双亲委派模型;Java的类加载器为什么要使用双亲委派模型;如何自定义自己的类加载器,自己的类加载器和Java自带的类加载器关系如何处理?

考点

这个题目主要考查ClassLoader的工作机制,即它是怎么把Class加载到JVM中?考查这个题目便于我们在日常的工作中更好的理解Java程序的工作原理。

类加载器有那些?

BootstrapClassLoader
ExtClassLoader
AppClassLoader
URLClassLoader
WebappClassLoader

每个类加载器加载了那些类?

  • BootstrapClassLoader(启动类加载器):主要加载JVM自身工作需要的类,完全由JVM自己控制;它是所有类加载器的父加载器,位于jre/lib/rt.jar。
  • ExtClassLoader(扩展类加载器):它既装载除了基本的Java API以外的扩展类,也负责装载其他的安全扩展功能;位于System.getProperty("java.ext.dirs")指向的目录。
  • AppClassLoader(系统类加载器):负责加载用户在$CLASSPATH里指定的类,位于System.getProperty("java.class.path")。
  • User-defined ClassLoader(用户自定义类加载器):直接用代码实现的类加载器,如:WebappClassLoader。

类是怎么加载的,为什么要使用双亲委派模型?

它们使用双亲委派的模型来加载;基于三个机制:委托、可见性和单一性

  1. 委托:当一个类加载和初始化的时候,类仅在有需要加载的时候被加载。首先加载这个类的请求由AppClassLoader委托给它的父类加载器ExtClassLoader,然后再委托给BootstrapClassLoader。BootstrapClassLoader会先看看rt.jar中有没有这个类,如果并没有这个类,就把这个请求返回到ExtClassLoader,它会查看jre/lib/ext目录下有没有这个类,如果这个类被ExtClassLoader找到了,那么它将被加载,而AppClassLoader不会加载这个类;而如果这个类没有被ExtClassLoader找到,那么再由AppClassLoader从classpath中寻找。
  2. 可见性:子类加载器可以看到父类加载器加载的类,而反之则不行。
  3. 单一性:父加载器加载过的类不能被子加载器加载第二次。

JVM怎么加载Class文件到内存?

  • 隐式加载:不通过调用ClassLoader来加载需要的类,而是通过JVM自动加载所需的类到内存。如,继承与类引用。
  • 显示加载:通过ClassLoader类来加载类的方式。如,this.getClass().getClassLoader().loadClass()/Class.forName()/自定义的类加载器的findClass()。

如何自定义类加载器,及怎么处理加载器关系?

自己定义的类加载器一般继承ClassLoader/URLClassLoader。

一般只需要重写findClass()方法;同一个类如果被两个类加载器加载,那么JVM不认为使相同的类;检查被请求的类是否已经被加载到命名空间,如果已被加载,则直接返回。

用到的代码:

private void hi(HttpServletRequest request, HttpServletResponse response) throws IOException {ClassLoader classLoader = HelloServlet.class.getClassLoader();while (classLoader != null) {response.getWriter().write(classLoader.getClass().getCanonicalName()+"\n");classLoader = classLoader.getParent();}
}

执行结果:

org.apache.catalina.loader.WebappClassLoader
java.net.URLClassLoader
sun.misc.Launcher.AppClassLoader
sun.misc.Launcher.ExtClassLoader

分析一下常见类加载错误有那些,是怎么产生的?

ClassNotFoundException
NoClassDefFoundError
UnsatisfiedLinkError
ClassCastException
ExceptionInInitializerError

记住,这里全部都是干货!!!

JVM到底怎么进行类加载器的呢?相关推荐

  1. Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论

    Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...

  2. JVM学习笔记3_类加载器

    JVM类加载器分为四种: 根类加载器(Bootstrap ClassLoader): 加载 JRE/lib/rt.jar 或者 Xbootclasspath选项指定的jar包,由C++实现,不是Cla ...

  3. jvm十二:自定义类加载器

    package com.atChina.jvm;import java.io.*;public class Test16 extends ClassLoader{private String clas ...

  4. JVM 学习三:类加载器

    类加载器 1 类加载器的分类 JVM 支持两种类型的类加载器:引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader) 从概念上来 ...

  5. JVM 学习二:类加载器子系统

    1 类加载器子系统的作用 类加载器子系统负责从文件系统或者网络中加载 Class 文件,Class 文件在文件开关有特定的文件标识 ClassLoader 只负责 Class 文件的加载,至于它是否可 ...

  6. JVM笔记7:类加载器

    虚拟机设计团队把类加载阶段中的"通过一个类的全限定名来获取描述此类的二进制字节流"这个动作放到Java虚拟机外部实现,以便让应用程序自己决定如何去获取所需要的类,实现这个动作的代码 ...

  7. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架...

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  8. JVM:类加载机制之类加载器

    JVM设计者把类加载阶段中的"通过'类全名'来获取定义此类的二进制字节流"这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类.实现这个动作的代码模块称 ...

  9. JVM——深入理解类加载器

    类加载器相关内容有很多,大概分以下几个关键点进行学习, 参考链接 https://www.bilibili.com/video/av47756459 目录 概览 JVM与程序的生命周期 类加载器生命周 ...

  10. Java的自定义类加载器及JVM自带的类加载器之间的交互关系

    JVM自带的类加载器: 其关系如下: 其中,类加载器在加载类的时候是使用了所谓的"父委托"机制.其中,除了根类加载器以外,其他的类加载器都有且只有一个父类加载器. 关于父委托机制的 ...

最新文章

  1. 软件测试面试的linux基础知识,linux基础面试题
  2. mysql 前后代表什么_MySQL的锁
  3. 钉钉小程序数据传递——子传父,父传子
  4. varnish 高性能方向代理服务器
  5. 《大话设计模式》读书笔记-第13章 建造者模式
  6. HDU4812 D tree 【点分治 + 乘法逆元】
  7. 常用头文件和一些简单的函数
  8. opencv cv2.copyMakeBorder()函数详解
  9. 颠覆传统网络管理 Aruba新一代网络解决方案重磅呈现
  10. windows服务器虚拟机 全屏,win7虚拟机的安装|vmware中win7虚拟机怎么设置全屏显示...
  11. Python.translate(table).maketrans(‘str1‘,‘str2‘)字符串翻译
  12. python实现数据结构--线性表
  13. 中债登——各功能快捷入口
  14. 使用计算机时应先按,计算机应用基础试卷及答案
  15. DNSPod吴洪声:国外域名注册商域名不许国内解析
  16. 笔记25 笨办法习题35分支和函数路线图
  17. DM9000C网卡驱动程序编写与测试
  18. 事关企业转型 联想超融合回答的5个关键问题
  19. vue3 vscode创建过程及element组件使用
  20. 卫星位置计算的c语言,gps卫星位置的计算

热门文章

  1. macOS 升级12.0.1后,virtualBox 又不能用了
  2. Qt学习之路(54): 自定义拖放数据对象
  3. Jsp基本指令和动作
  4. 我的Android进阶之旅------Android实现音乐示波器、均衡器、重低音和音场功能
  5. HashTable VS Dictionary
  6. 代码帝:一个月10万行代码
  7. 编写脚本常用的几种语句
  8. 分布式日志收集系统: Facebook Scribe之配置文件
  9. PowerVim - 强大的vim配置
  10. poj 2096 Collecting Bugs 概率dp入门题