jdk默认提供了三种类加载器:

1.Bootstrap ClassLoader(引导类加载器):

将<JAVA_HOME>\lib目录下的类库加载到虚拟机内存中,用来加载java的核心库,此类加载器并不继承于java.lang.ClassLoader,不能被java程序直接调用,代码是使用C++编写的.是虚拟机自身的一部分.

2.Extension ClassLoader(扩展类加载器)  :

它用来加载 Java 的扩展库(jre/ext/*.jar)。Java 虚拟机的实现会提供一个扩展库目录,负责加载<JAVA_HOME>\lib\ext目录或java.ext.dirs系统变量指定的路径中的所有类库。

3.Application ClassLoader (应用程序类加载器):

它根据 Java 应用的类路径(CLASSPATH)来加载 Java 类。一般来说,Java 应用的类一般都是由它来完成加载的。可以通过 ClassLoader.getSystemClassLoader()来获取它。

此外用户还可以自定义类加载器来满足特殊需求,继承与java.lang.ClassLoader

关系如下图

类加载器工作机制 双亲委派模型

如果一个类加载器收到类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器完成。每个类加载器都是如此,只有当父加载器在自己的搜索范围内找不到指定的类时(即ClassNotFoundException),子加载器才会尝试自己去加载。

好处: 可以保证java核心库的安全性,以String类为例,用户自定义的java.lang.String并不会被加载,也就不会产生安全隐患。

测试:

public class Test {
public static void main(String[] args) {
ClassLoader classLoader=Test.class.getClassLoader();//获取Test的类加载去
System.out.println(classLoader);
ClassLoader c=classLoader.getParent();//获取Test类加载器的父类加载器
System.out.println(c);
System.out.println(c.getParent());//获取c的父类加载器
}
}

结果:

sun.misc.Launcher$AppClassLoader@b4aac2
sun.misc.Launcher$ExtClassLoader@154617c
null

分析:Test是由AppClassLoader加载器加载的,AppClassLoader的Parent 加载器是 ExtClassLoader,但是ExtClassLoaderParent为 null 是因为它是由Bootstrap ClassLoader加载的,由C++编写,涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用。

类的加载过程一般分为三部分:

1.装载:查找和导入Class文件,类加载器使用“双亲委托”模型在指定的类路径下搜索相应的class字节码文件,从class字节码文件内容生成类的Class对象。

2.链接:验证字节码文件的合法性,是否能在当前JVM版本环境下运行,为类的静态域分配内存空间,如果当前类引用了其它类,则继续解析对其它类的引用,把虚拟机常量池中的符号引用转换为直接引用。

3.初始化:对静态变量,静态代码块执行初始化工作

类加载的动态性体现:

一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是一种可以理解的机制,而用到时再加载这也是java动态性的一种体现

最新文章

  1. IDEA插件
  2. PHP面向对象(OOP)编程入门教程
  3. C#的循环语句
  4. 找到SQL Server数据库历史增长信息
  5. hdu 1261 字串数
  6. min—width的使用
  7. 去掉StringBuilder或String 最后一个项逗号
  8. PAT 1016. Phone Bills
  9. java 深clone和浅clone
  10. Atitit.hibernate体系结构大总结
  11. javascript中对变量类型的推断
  12. win10下部署.Net Web项目到IIS10
  13. 【Git】(2)---checkout、branch、log、diff、.gitignore
  14. Singleton(单例)模式和Double-Checked Locking(双重检查锁定)模式
  15. Xcode7如何真机调试
  16. docker 查看容器的网络连接
  17. petri网初步
  18. 阅读Protobuf官网的一些笔记
  19. BurpSuite—-Target模块(目标模块)
  20. BS Web窗体 动态修改WebConfig文件参数及数据库链接串

热门文章

  1. C# Winform Dev控件之TileControl
  2. C# WinForm 第一个项目控件使用心得
  3. python学习10—迭代器、三元表达式与生成器
  4. 在Nginx/Tengine服务器上安装证书
  5. 基于LNMP架构部署wordpress
  6. 关于windows cmd的一些便捷应用
  7. nodejs 在MYSQL 数据库中插入和查询数据
  8. 在Vue项目中,添加的背景图片在服务器上不显示,如何处理
  9. 使用vue-cli 脚手架快速搭建单页面组件 -------webpack工具的介绍
  10. cdh maven仓库地址