类加载机制

类加载机制
类加载的时机
类被加载到虚拟机内存,到卸载出内存为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用以及卸载7个阶段。
虚拟机规定了5种情况必须立即对类进行加载:
1、遇到new,getstatic,putstatic,invokestatic四条字节码指令,如果类没有进行初始化,则先触发其初始化。其中,被final修饰的字段,已在编译期把结果放到常量池。
2、使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行初始化,则需要触发其初始化。
3、当初始化一个类的时候,如果发现父类没有进行初始化,则需要触发其父类初始化。
4、当虚拟机启动时,用户需要制定一个执行的主类,虚拟机会先初始化这个主类。
5、当使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行过初始化,则需要先触发其初始化。
其中:对于静态字段,只有直接定义这个字段的类才会被初始化,通过子类来引用父类中定义的静态字段,只会触发父类的初始化而不会触发子类的初始化;
类加载过程
加载
验证
准备
解析
初始化
类加载器
类与类加载器
类加载器虽然只用于实现类的加载动作,但它在java程序中起到的作用远远不限于类加载阶段。对于任何一个类,都需要由加载它的类加载器和这个类本身一桶确立其在java虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间。比较两个类是否相等,只有在这两个类在同一个类加载器加载的前提下才有意义,否则,这两个类来源于同一个class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那么这两个类就不必相等。
双亲委派模型:
如果一个类加载器收到了类加载的过程,他首先不会自己去尝试加载这个类,而是吧这个请求派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传到顶层的启动类加载器中,只有当父类加载器反馈无法完成这个加载请求,子加载类才会尝试自己去加载。
为什么使用双亲委派模型?
为了安全。假如不使用双亲委派这个模型的话,自己写一个String类。然后自己写一个类加载器把自己写的String类加载到内存的话,这样有可能会对客户输入的信息进行窃取。造成安全泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

shichangle01

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

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

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

打赏作者

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

抵扣说明:

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

余额充值