类加载机制
来源:互联网 发布:建筑测量学知乎 编辑:程序博客网 时间:2024/05/29 11:32
为知笔记http://a36bf370.wiz03.com/share/s/2zq_dM1mlQS52P2klg35rzwa2N_BL516Ik0O2DHUJE1jtbbE
类的加载步骤
- 类的加载
- 类的连接
- 类的初始化
类的加载
当程序主动使用某个类时,如果该类未被加载到内存中,就会加载进内存,并为之创建一个java.lang.Class对象。类的加载由类加载器完成,JVM提供了系统类加载器,而开发者也可以通过继承ClassLoader基类来创建自己的类加载器。类加载器通常无须等到“首次使用”该类时加载该类,java虚拟机规范允许系统预先加载某些类。
通过使用不同的类加载器来加载不同来源的二进制数据
- 从本地文件系统加载class文件,这是前面绝大部分示例程序的类加载方式。
- 从JAR包加载class文件。
- 通过网络加载class文件。
- 把一个java源文件动态编译并执行。
类的连接
类加载之后,系统生成一个对应的Class对象,接着将会进入连接阶段。连接阶段负责把类的二进制数据合并到JRE中。分为以下三个阶段。
- 验证 : 用于检验被加载的类是否有正确的内部结构,并和其他类协调一致。
- 准备 : 负责为类的类变量分配内存,并设置默认初始值。
- 解析 : 将类的二进制数据中的符号引用替换成直接引用。
类的初始化
在类的初始化阶段,虚拟机负责对进行初始化,主要就是对类变量进行初始化。
类的初始化时机
- 创建实例。
- 调用某个类的类方法(静态方法)。
- 访问某个类或者接口的类变量,或为该类变量赋值(静态变量)。
- Class.forName()加载类。
- 初始化某个类的子类。当初始化某个类的子类时,该子类的所有父类方法都会被初始化。
- 直接使用java.exe命令来运行某个主类。
类加载器
类加载器负责将.class加载到内存中,并为之生成对应的java.lang.Class对象。一旦一个类被加载到JVM中,同一个类就不会被再次加载。同一个类指全限定类名(包名和类名的统称)和类加载器相同的情况下加载的出的类。
当JVM启动时,会形成由三个类加载器组成的初始类加载器的层次结构。
- Bootstrap ClassLoader: 根类加载器
- Extension ClassLoader : 扩展类加载器
- System ClassLoader : 系统类加载器
Bootstrap ClassLoader
被称为引导类加载器,负责加载java的核心类。可以通过执行java.exe命令时, 使用-Xbootclasspath选项或使用-D选项指定sun.boot.class.path系统属性值进行加载附加的类。该类不是java.lang.ClassLoader的子类。由JVM自身实现。
Extension ClassLoader
被称为扩展类加载器,负责加载JRE的扩展目录(jre/lib/ext或者由java.ext.dirs系统属性指定的目录)中的jar包的类。只需要把自己开发的类打包成JAR文件,放入到该目录下,既可以扩展核心类意外的新功能。
System ClassLoader
被称为系统类加载器,负责JVM启动时加载来自java命令的-classpath选项,java.class.path系统属性,或者CLASSPATH环境变量所制定的JAR包的类和类路径。程序可以通过ClassLoader的静态方法getSystemClassLoader()来获取系统类加载器。如果没有特别指定,则用户自定义的类加载器都以类加载器作为父加载器。
类加载机制
- 全盘负责 :当一个类加载器负责加载某个类时,该类所依赖和引用的其他类也由该类加载器负责载入,除非显示使用另外一类加载器载入。
- 父类委托 : 先让父类加载器尝试加载该类,加载失败才尝试从自己类路径中加载该类。
- 缓存机制 : 类加载过就会被缓存,所以类加载前都会从缓存中找,缓存没有的情况下才会进行加载。
类加载器的加载步骤
- 检测类是否加载过,有则直接返回java.lang.Class对象,加载结束。
- 父类加载器是否存在
- 存在 使用父类加载器载入目标类
- 加载成功 返回类对象
- 加载失败 当前类加载器相关的类路径中寻找,找到则从文件中载入该类。返回类对象
- 不存在 使用根加载器加载目标类。
- 加载成功 返回类对象
- 加载失败 抛出ClassNotFoundException。
- 存在 使用父类加载器载入目标类
- 类加载机制-类加载机制
- Java类加载机制
- Tomcat类加载机制
- java 类加载机制
- Tomcat类加载机制
- Tomcat类加载机制
- Java类加载机制
- Java 类加载机制
- Tomcat类加载机制
- 类加载机制 2
- [Java] 类加载机制
- Java类加载机制
- Tomcat类加载机制
- 虚拟机类加载机制
- java类加载机制
- Java加载类机制
- Tomcat6类加载机制
- Java类加载机制
- LeetCode刷题(C++)——Valid Parentheses(Easy)
- Linux 命令行while do
- ArcGIS不能创建几何网络
- Http协议
- Android使用ViewPager+Fragment实现标签分页
- 类加载机制
- Java递归解决全排列问题
- Ajax请求步骤,原生js代码
- Caused by: java.sql.BatchUpdateException: You have an error in your SQL syntax; check the manual tha
- 一颗会开花的树
- C++ map的基本操作和使用
- 如何从从官网下载各个版本的jquery
- L1-001. Hello World
- Java.lang.reflect简单讲解