java类加载

简单介绍

类加载(类初始化):加载、链接、初始化
java中所有类都可以看成java.lang.class的对象
类加载器通常由jvm提供,jvm提供的类加载器通常被称为系统类加载器

类加载的来源

从本地文件系统的加载class文件
从JAR包加载class文件
通过网络加载class文件

类连接

当类被加载之后,系统为之生成一个对应的class对象,接着将会进入连接阶段,链接负责把类的二进制数据合并到JRE中,类链接又可以分为如下三个阶段。
验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致
准备:类准备阶段负责为类的类的变量分配内存,并设置默认初始值
解析:将类的二进制数据中的符号引用替换成直接引用

类初始化

在类初始化中,虚拟机负责对类进行初始化,主要就是对类变量进行初始化。在java类中对类变量指定初始值有两种方法:
声明类变量时指定初始值
使用静态初始化块为类变量指定初始值

类加载机制

Jvm类加载机制主要有以下三种
全盘负责:当一个类加载器负责加载某个class时,该类所依赖的和引用的其他class文件也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入
父类常托:先让父类加载器试图加载该类,只有在父类加载器无法加载该类时尝试从自己的类路径中加载该类
缓存机制:缓存机制将会保证所有加载过的class都会被缓存,当程序中需要使用某个class时,类加载器先从缓存区搜寻该类,只有当缓存区中不存在该类对象时,系统才会读取该类对应的二进制数据,并将其转换class对象,存入缓存区中。这就是为什么修改了class后必须重新启动jvm,程序所做的修改才会生效的原因。

注:类加载器之间的父子关系并不是继承上的父子关系,这里是指类加载实例之间的关系。
根加载->扩展类加载->系统类加载->用户类加载   

类初始化时机

java中首次通过下面6种方式来使用某个类或者接口时,系统会初始化该类或者接口:
创建类的实例,该方法包括:new一个该类的对象、通过反射创建一个对象、通过返序列化创建一个类的实例
调用某个类的类方法(静态方法)
访问某个类或者接口的类变量,或为该类变量赋值
使用反射方式来强制创建某个类或接口对应的java.lang.class对象。例如代码Class.forName(“Person”),如果系统还未初始化Person类,则会导致该Person类被初始化,并返回Person类的对应java.lang.class对象,
初始化某个类的子类,该子类的所有父类都会被初始化。
直接使用java.exe命令来运行某个主类。当运行某个主类时,程序会先初始化该主类。


特殊情况
对于一个final型类变量,如果该类变量的值在编译时就可以确定下来,那么该类变量相当于“宏变量”,java编译器会在编译时直接把这个类变量出现的地方替换成他的值,因此即使程序使用该静态变量,也不会导致该类初始化。如果编译时无法确定该值,会导致该类被初始化。

当使用ClassLoader.loadClass()加载该类,只是加载该类,并不会执行初始化
使用Class.forName方法会强行初始化该类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值