java的类加载笔记

一、JVM进程终止的几种情况

(1)程序正常运行至结束

(2)使用System.exit()(ps:System.exit(0)表示正常退出程序,关闭JVM,非0是非正常退出,一般放在catch块中)或Runtime.getRuntime().exit()(ps:同上)

(3)程序执行过程中遇到未捕获的异常或错误而结束

(4)程序所在平台强制结束了JVM进程

二、类的加载过程

如果某类没有被加载到内存中时,系统会通过加载、连接、初始化三个步骤来对类进行初始化

(1)加载

JVM将类的 .class 文件读入内存,并为之创建一个java.lang.Class对象

类的加载由JVM的类加载器完成,可以通过继承ClassLoader类来创建自己的类加载器

类的不同加载来源:

从本地文件系统来加载class文件(常用)、从JAR包中加载class、通过网络加载class、将一个java源文件动态编译并加载

(2)连接

分为三个步骤:

验证:验证类是否有正确的内部结构,并与其它类一致

准备:为类的静态属性分配内存,并设置默认初始值

解析:将类中的二进制数据中的符号引用替换成直接引用

(3)初始化

主要负责对类的静态属性进行初始化

两种方式:声明静态属性时指定初始值、使用静态初始化块为静态属性指定属性值

三、类初始化的时机

(1)创建类的实例(用new创建实例、用反射创建实例、用反序列化的方法创建实例)

(2)访问类的静态方法

(3)访问静态属性或为静态属性赋值

(4)利用反射方法强制创建某个类或接口的java.lang.Class 对象

(5)初始化某个类的子类,那么父类也会被初始化

(6)直接使用java.exe命令来运行某个主类

(ps:final型静态属性在编译时已经成为了编译常量,调用时属于对类的被动使用不会导致类的初始化、Classload.load方法只加载不初始化)

四、类加载器

载入JVM中的类都有一个唯一的标识(类名 包名 类加载器实例名)

当JVM启动时,会形成由三个类加载器组成的初始类加载器层次结构(分别为 根类加载器、拓展类加载器、系统类加载器)

创建自定义类加载器:

除了根加载器,所有的加载器都是ClassLoad的子类,而ClassLoad类有三个关键的方法:loadclass、findclass、defineClass(用于将字节码文件转换为Class对象)

要自定义自己的加载器可以重写loadclass、findclass方法,推荐重写findclass方法

书上列举了一个例子重写了findclass使得在加载之前编译源文件,来直接运行java源文件:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值