【JVM虚拟机】描述Java类加载器的工作原理及其组织结构(简述类加载过程)

Java类加载器的作用就是在运行时加载类。

Java类加载器基于三个机制:委托性、可见性和单一性。

1)委托机制是指双亲委派模型。当一个类加载和初始化的时候,类仅在有需要加载的时候被加载。假设你有一个应用需要的类叫做Abc.class,首先加载这个类的请求由Application类加载器委托给它的父类加载器Extension类加载器,然后再委托给Bootstrap类加载器。Bootstrap类加载器会先看看rt.jar中是否含有这个类,因为并没有这个类,所以这个请求又会回到Extension类加载器,它会查看jre/lib/ext目录下有没有这个类,如果这个类被Extension类加载器找到了,那么它将被加载,而Application类加载器不会加载这个类;而如果这个类没有被Extension类加载器找到,那么再由Application类加载器从classpath中寻找,如果没有找到,就会抛出异常。

双亲委派机制的优点就是能够提高软件系统的安全性。因为在此机制下,用户自定义的类加载器不可能加载本应该由父加载器加载的可靠类,从而防止不可靠的恶意代码代替由父类加载器可靠的代码。如,java.lang.Object类总是由根类加载器加载的,其他任何用户自定义的类加载器都不可能加载含有恶意代码的java.lang.Object类。

2)可见性原理是子类的加载器可以看见所有父的父类加载器加载的类,而父类加载器看不到子类加载器加载的类。

3)单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会再次加载父类加载器加载过的类。

 

Java的类加载器有三个,对应Java的三种类

BootstrapClassLoader:负责加载系统类(指的是内置类,像String、Obeject等)

ExtensionClassLoader:负责加载扩展类(就是继承类和实现类

ApplicationClassLoader:负责加载应用类(用户自定义的类

 

Java提供了显示加载类的API:Class.forName(classname)。

双亲委派中用到的方法:

findLoadedClass()
loadClass()
findBootstrapClassOrNull()
findClass()
defineClass():把二进制数据转换成字节码。
resolveClass()

自定义类加载器的方法:

继承ClassLoader,重写findClass()方法。

 

类加载过程

加载——>验证——>准备——>解析——>初始化

1)  加载:根据查找路径找到相应的class文件,然后导入。类的加载方式分为隐式加载显示加载两种。隐式加载指的是程序在使用new关键词创建对象时,会隐式的调用类的加载器把对应的类加载到jvm中。显示加载指的是通过直接调用class.forName()方法来把所需的类加载到jvm中。

2)  验证:检查夹加载的class文件的正确性。

3)  准备:给类中的静态变量分配内存空间。

4)  解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址。

5)  初始化:对静态变量和静态代码块执行初始化工作。
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值