java--类加载相关知识点

来源:互联网 发布:通用编程器报价 编辑:程序博客网 时间:2024/06/08 07:12

摘自《疯狂java讲义》

类的加载
类的加载指的是将类的class文件读入内存,并为之创建一个java.lang.class对象,当程序使用任何类时,系统都会为之创建一个java.lang.class对象。类加载器无需等到首次使用该类时才加载该类,java虚拟机规范允许预先加载某些类

类的连接
当类被加载后,系统为之生成一个对应的Class对象,接着将会进入连接阶段,连接阶段负责把类的二进制数据合并到JRE中。类连接分为如下三个阶段

  1. 验证:验证阶段用于检查被加载的类书否具有正确的内部结构,并和其他类协调一致
  2. 准备:类准备阶段负责为类的类变量分配内存,并设置默认初始值。
  3. 解析:将类的二进制数据中的符号引用为直接引用

类初始化的时机

  1. 创建类的实例。为某个类创建实例的方式包括:使用new操作符来创建实例,通过反射来创建实例,通过该反序列化的方式创建实例
  2. 调用某个类的类方法(静态方法)
  3. 访问某个类或者接口的类变量,或者为该变量赋值
  4. 使用反射方式来强制创建某个类或接口对应的java.lang.class对象。
  5. 初始化某个类的子类,当初始化某个类的子类时,该子类的所有父类都会被初始化
  6. 直接运行java.exe命令来运行某个主类,当运行某个主类,程序会先初始化该主类
    **特殊情形
    对于一个final型的类变量,如果该类变量的值在编译时就可以确定下来,那么这个类变量相当于宏变量。java编译器会在编译时直接把这这个变量出现的地方替换成值,不会导致初始化该类。

类加载器
类加载器负责将.class文件加载到内存,并为之生成对应的java.lang.class对象
当使用ClassLoader类的loadClass方法来加载某个类时,该方法只是加载该类,并不会执行该类的初始化。使用Class的froName静态方法才会导致强制初始化该类

类加载机制
1. 全盘负责:当一个类加载器负责加载某个Class时,该Class所有依赖的引用的其他Class也将有该类加载器负责载入,除非显示的使用另一个列加载器来载入
2. 父类委托:先让parent类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类
3. 缓存机制:缓存机制将会保证所有加载过的Class都会被缓存,当程序需要使用某个Class时,类加载器先从缓存区搜寻该Class,只有当缓存区中不存在该Class对象时,系统才会读取fail类的对应的二进制数据,并将其转换为Class对象,存入缓存区,这就是为什么修改了Class后,必须重启JVM,程序所做的修改才会生效的原因

在程序运行时获取类的信息

  1. 编译和运行时都完全知道类型的具体信息,在这种情况下,可以使用instanceof运算符进行判断。再利用强制类型转换成其运行时类型变量即可
  2. 如果编译时不知道具体类型信息,必须使用反射

获取Class对象的方式

  1. 使用Class类的forName静态方法,该方法需要传入字符串,该字符串参数的值是某个类的全限定类名(必须包含完整包名)
  2. 调用某个类的class属性来获取
  3. 调用某个对象的getClass方法,该方法是java.lang.Object类中的一个方法
0 0
原创粉丝点击