java 类加载器

1、java虚拟机与程序的声明周期

在如下几种情况下,java虚拟机将结束声明周期

1)执行了System.exit()方法

2)程序正常执行结束

3)程序在执行过程中遇到了异常或错误而异常终止

4)由于操作系统出现错误而导致java虚拟机进程终止

2、类的加载、连接与初始化

1)加载:查找并加载类的二进制数据

2)连接:

验证:确保被加载的类的正确性

准备:为类的静态变量分配内存,并将其初始化为默认值

解析:把类中的符号引用转换为直接饮用

3)初始化:为类的静态变量赋予正确的初始值


java程序对类的使用方式可以分为两种

1)主动使用

2)被动使用

所有的java虚拟机实现必须在每个类或接口被java程序“首次主动使用”时才初始化他们。

主动使用:

1)创建类的实例  Dog dog = new Dog();

2)访问某个类或接口的静态变量,或者对该静态变量赋值  Dog.NAME

3)调用类的静态方法   Dog.show();

4)反射(如Class.forName("Dog.class"))

5)初始化一个类的子类,父类也跟着初始化

6)java虚拟机启动时被标明为启动类的类(带有main方法的类)

除了以上六种情况,其他使用java类的方法都被看做是对类的被动使用,都不会导致类的初始化。

3、类的加载

类的加载值得是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的 数据接口

加载.class文件的方式

1)从本地系统中直接加载

2)通过网络下载.class文件

3)从zip,jar等归档文件中加载.class文件

4)从专有数据库中提取.class文件

5)将java源文件动态编译为.class文件


类的加载的最终产品是位于堆区中的class对象

class对象封装了类在方法区内的数据结构,并且向java程序员提供了访问方法内的数据结构的接口

有两种类型的类加载器

1)虚拟机自带的加载器

根类加载器

扩展类加载器

系统类加载器

2)用户自定义的类加载器

java.lang.ClassLoader的子类

用户可以定制类的加载方式

类加载器并不需要等到某个类被“首次主动使用”时在加载它。

JVM规范允许类加载器在预料某个类将要被使用时就预先加载它,如果在预先加载的过程中,遇到了.class文件缺失或存在错误,

类加载器必须在程序首次主动使用该类时才报错误(LinkageError错误)

如果这个类一直没有被程序主动使用,那么类加载器就不会报告错误。

4、类的验证

类被加载后,就进入了连接阶段,连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去。

类的验证的内容:

1)类文件的结构检查

2)语义检查

3)字节码验证

4)二进制兼容性的验证

5、类的初始化

1)如果这个类没有被加载和连接,那就先进行加载和连接

2)如果类存在直接的父类,并且这个父类没有被初始化,那就先初始化直接的父类。

3)如果累存在初始化语句,那就一次执行这些初始化语句。

注意:

当java虚拟机初始化一个类时,要求他的所有父类都已经被初始化,但是这条规则并不适用于接口

1)在初始化一个类时,并不会先初始化他所实现的接口。

2)在初始化一个接口时,并不会先初始化他的父接口

因此,一个父接口并不会因为他的子接口或者实现类的初始化而初始化,只有当程序首次使用特定接口的静态变量时,才会导致接口的初始化。

3)只有当程序访问的静态变量或静态方法确实在当前类或当前接口定义时,才可以认为是对类或接口的主动使用

4)调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。

6、类加载器和父类委托机制

加载器结构

的加载遵循父类委托机制

父类委托机制:在父类委托机制中,哥哥加载器按照父子关系形成树形结构,除了根类加载器以外,其余的类加载器都有且只有一个父加载器。

若有一个类加载器能成功加载类,那么这个类加载器被称为类加载器,所有能成功返回Class对象的引用的类加载器(包括定义类加载器)都被称为初始类加载器。

父类委托机制的优点是能够提高软件系统的安全性,因为在此机制下,用户自定义的类加载器不可能加载应该有父加载器加载的可靠类,从而防止不可靠甚至恶意

的大妈代替由父加载器的可靠代码。例如,java.lang.Object类总是由根类加载器加载,其他任何用户自定义的类加载器都不可能加载含有恶意代码的java.lang.Object类

7、命名空间

每个类加载器都有自己的命名空间,命名空间由该类加载器及所有父加载器所加载的类组成,在同一个命名空间中,不会出现类的完整名字(包括类的包名)相同的两个 类,在不同的命名空间中,有可能会出现类的完整名字(包括类的包名)相同的两个类。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fjkxyl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值