博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java之ClassLoader
阅读量:3908 次
发布时间:2019-05-23

本文共 1699 字,大约阅读时间需要 5 分钟。

程序从编译到执行的过程

  • 编译器将Test.java文件编译为Test.class字节码文件
  • ClassLoader将字节码文件转化为JVM中的class(Test)对象
  • JVM利用class(Test)对象实例化为Test对象

类的生命周期(类的装载过程)

在这里插入图片描述

装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象;

链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;

校验:检查导入类或接口的二进制数据的正确性;(文件格式验证,元数据验证,字节码验证,符号引用验证)

准备:给类的静态变量分配并初始化存储空间;

解析:将常量池中的符号引用转成直接引用;

初始化:激活类的静态变量的初始化Java代码和静态Java代码块,并初始化程序员设置的变量值

ClassLoader 的作用

  • 负责将 Class 加载到 JVM 中
  • 审查每个类由谁加载(父优先的等级加载机制)
  • 将 Class 字节码重新解析成 JVM 统一要求的对象格式

ClassLoader的分类

  • Jvm类加载器(BootstarpClassLoader)
  • Jvm扩展类加载器(extClassLoader)
  • 系统类加载器(SystemClassLoader)(Starkoverflow高赞回答认为Both AppClassLoader and SystemClassLoader are same,即系统类加载器和应用程序类加载器是一样的
    ClassLoader.getSystemClassLoader方法无论何时均会返回ApplicationClassLoader,其只加载classpath下的class文件
  • 应用程序类加载器(AppClassLoader)
  • 自定义类加载器
    在这里插入图片描述

ClassLoader加载顺序

=>Jvm类加载器加载JAVA_HOME/lib下的所有jar文件

=>Jvm扩展类加载器加载JAVA_HOME/lib/ext下的所有jar文件

=>系统类加载器加载指定classpath下所有jar文件

=>自定义类加载器加载继承官方提供的ClassLoader类的自定义实现加载器class文件。

类加载器的双亲委派机制

四种类加载器的层次关系就称为双亲委派模型

在这里插入图片描述
双亲委派模型中除了BootStrap外,其他类加载器都有自己的父类加载器
当一个类加载器收到加载类请求时,先不自己处理而是把加载请求委托给父加载器处理,只有当所有父加载器无法加载此类时子类才尝试自己加载
双亲委派模型从jdk1.2之后引入,但它不强制约束,甚至可以破坏双亲委派模型来进行类加载(典型:OSGI技术:Java模块化技术)

双亲委派机制的好处

采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。

(1)避免多份同样字节码的加载
(2)安全

类的加载方式

隐式加载:new

显式加载:loadClass,forName

loadClass,forName的区别

Class.forName得到的class是已经初始化完成的,即执行了静态代码块的

在这里插入图片描述
在这里插入图片描述
ClassLoader.loadClass得到的class是还未进行链接处理的,ClassLoader.loadClass可以使用在Spring IOC的延迟加载机制中,SpringIOC为了加快初始化速度,大量采用了懒加载(延迟加载)技术,等使用到的时候在初始化对象
在这里插入图片描述

转载地址:http://wrqen.baihongyu.com/

你可能感兴趣的文章
maven 配置
查看>>
设计模式》学习笔记--适配器Adapter
查看>>
ActiveMQ 中的消息游标(Message cursors)
查看>>
消息游标
查看>>
activemq高级特性
查看>>
MQ使用经验
查看>>
Lucene使用Filter搜索过滤
查看>>
Lucene自定义排序
查看>>
Lucene自定义同义词分词器
查看>>
Lucene 自定义分词器
查看>>
Lucene对index操作
查看>>
《构建高性能web站点》笔记--基础架构篇
查看>>
Tomcat工作原理
查看>>
The Apache Velocity Project
查看>>
Java 7 的新特性一览表
查看>>
Tomcat处理HTTP请求源码分析(上)
查看>>
Tomcat处理HTTP请求源码分析(下)
查看>>
SOA在当今中国企业的发展现状
查看>>
系统架构设计的一点思考
查看>>
认识抽象的陷阱-过度设计
查看>>