1、类加载子系统中有哪些常用类加载器?

1、BootStrapClassLoader(负责加载基础类库中的类,例如Object,String....)

2、ExtClassLoader(负责加载扩展类库中的类 ext/...)

3、AppClassLoader(负责加载classpath路径下我们自己定义的类)

4、自定义ClassLoader(可以指定自己要加载的路径或加载方式)

2、如何获取常用的类加载器?

1.AppClassLoader (应用加载器,默认加载ClassPath路径中的类-大部分是我们自己写的类)
ClassLoader appClassLoader = ClassLoader.getSystemClassLoader();
2.ExtClassLoader(扩展类加载器,负责加载ext包中的类)
ClassLoader extClassLoader = appClassLoader.getParent();
3.BootStrapClassLoader(根类加载器,负责加载基础类库中的类-rt.jar)
ClassLoader bootStrapClassLoader=extClassLoader.getParent();
String类的类加载器是什么?
ClassLoader classLoader = String.class.getClassLoader();
获取当类ClassLoaderTests的类加载器
classLoader = ClassLoaderTest.class.getClassLoader();

3、什么是双亲委派类加载模型?

双亲委派可以简单的理解为依次向上询问类是否已经加载过,假如类加载过则无需再次加载。假设没有加载过,则从顶层(BootStrapClassLoader)向下依次尝试是否可以加载此类,假设可以则对类进行加载。

4、为什么使用双亲委派加载模型?

通过这种机制可以更好的保证一个类在内存中只被加载一次,例如:java.lang.Object这个基础类库中的类不需要反复加载

5、双亲委派加载模型有什么弊端吗?

假如不同项目部署到了同一个web服务中,但是不同项目中同包名、类名相同的类(内容不同),这样可能会导致一个类不会被加载。假如要想解决这个问题可以自己定义类加载规则,但是你无论怎么定义,建议基础类库还是要使用双亲委派方式进行加载。

6、你能说说类加载的基本步骤吗?

1、查找类(例如从指定路径找到包名+类名对应的文件)

2、读取类(通过字节输入流对类进行读取)

3、校验类(对内存中读取到的类信息进行校验,默认初始化等)

4、创建字节码对象(java.lang.Class)

7、什么情况下会触发类的加载?

1、直接通过类加载器(ClassLoader)的loadClass去加载

2、基于Class.forName(“包名.类名”)方式去加载

3、直接访问类的属性,方法,构建类的对象

8、类加载时一定会执行静态代码块吗?

不一定,静态代码块是否执行取决于类加载时是否执行了类的初始化。

9、如何理解类的主动加载和被动加载?

1、主动加载:访问本类属性或方法时触发的类的加载

2、被动加载:通过本类访问对应的父类属性、方法时,本类属于被动加载,父类属于主动加载。被动加载的类不会进行初始化

10、什么场景下需要自己定义类加载器?

1、指定加载源头(例如从数据库中读取类)

2、保证类的安全(例如可以在类编译时加密,加载时解密)

3、打破双亲委派模型(对自己写的类不想使用双亲委派机制了)

11、内存中的一个类的字节码对象(Class)可以有多个吗?

可以,即使是同一个类,但是他的类加载器不同,生成的字节码对象也可以不同。

最新文章

  1. 源码分析netty服务器创建过程vs java nio服务器创建
  2. 学习微信小程序之css8
  3. 回流(reflow)与重绘(repaint)
  4. 设置UIImage的渲染模式:UIImage.renderingMode
  5. java.lang.NoClassDefFoundError: org/aopalliance/aop/Advice
  6. MySQL 之 query cache
  7. 我的opencv之旅:ios人脸识别
  8. 025-ViewData、ViewBag与TempData概述
  9. uWSGI uwsgi_response_write_body_do(): Connection reset by peer 报错的解决方法
  10. C随便练练手的题
  11. JSP基础学习(二)
  12. js模块化认识1
  13. SQL SERVER统计服务器所有的数据库(数据库文件)、表(表行数)、字段(各字段)等详细信息
  14. 201521123012 《Java程序设计》第十三周学习总结
  15. 基于python的web应用开发-添加关注者
  16. Heartbeat详解
  17. 初探APT攻击
  18. jar命令打jar包
  19. 记hangfire后台任务运行一段时间后不运行了。
  20. c++学习笔记(七)- lambda表达式 迭代器 算法

热门文章

  1. 图论之最短路径 Floyd算法
  2. 依那西普治疗多关节型和系统型JRA的长期疗效[EULAR2007_SAT0397]
  3. 如何在电脑上配置Vue开发环境
  4. 基于docker的spark分布式与单线程、多线程wordcount的对比实验
  5. python 在一个文件夹的所有文件中查找关键字
  6. 浅析容器运行时奥秘——OCI标准
  7. bzoj5000+的洛谷题号
  8. Vulnhub:maskcrafter-1.1靶机
  9. taro框架开发微信小程序遇到的问题
  10. linux中进程和线程简单介绍