码迷,mamicode.com
首页 > 其他好文 > 详细

类加载器

时间:2020-01-09 13:25:45      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:自己的   字节流   java_home   父类   实现   c++   二进制   int   信任   

类加载器:

实现 "通过类的全限定名获取描述此类的二进制字节流" 动作(类加载阶段)的模块。

判断两个类是否相等:类来自相同的 class 文件 && 被同一个虚拟机加载 && 由同一个类加载器加载。

类加载器的种类:

对虚拟机来说,只有启动类加载器(Bootstrap ClassLoader,由 C++ 实现,是虚拟机的一部分)和其他类加载器(由 Java 语言实现,独立于虚拟机外部,都继承自 java.lang.ClassLoader)。

1、启动类加载器(Bootstrap ClassLoader):

负责将 <JAVA_HOME>\lib 目录中的、或者 Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的类库加载到虚拟机的内存中;无法被应用程序直接引用;

2、扩展类加载器(Extension ClassLoader):

负责加载 <JAVA_HOME>\lib\ext 目录中的、或者 java.ext.dirs 系统变量所指定的路径中的所有类库;可以直接使用扩展类加载器;

3、应用程序加载器(Application ClassLoader):

加载用户类路径(Class Path)上所指定的类库,如果应用程序没有自定义加载器,这个就是程序中默认的类加载器。

 

双亲委派模型(Parents Delegation Model):

除了启动类加载器,每个类加载器都有自己的父类加载器,此处的父子关系使用组合来复用父类加载器的代码。

工作过程:

如果一个类加载器收到类加载的请求,它首先把这个请求委派给父类加载器去完成,每一层的类加载器都是如此,即:所有的加载请求都应该传送到最顶层的启动类加载器,只有当父加载器反馈自己无法完成这个加载请求时,子类加载器才会尝试自己加载。

双亲委派模型如何保护可信任类库(lib、ext 文件夹中的类库)?

1、假设用户自己编写了一个 java.lang.Integer 的类,放在 ClassPath 中,则应用程序加载器在加载该类时,将不会加载成功(编译成功),应用程序加载器只会使用父类加载器返回的 java.lang.Integer 类。

2、假设用户自己编写了另外一个 java.lang.Integer2 的类,暗示该类是 java.lang 包中的类,尝试在 Integer2 类中访问 java.lang 包中的其他可信任的类并进行了一些破坏操作,此时该类会被应用程序加载器加载成功(因为启动类加载器、扩展类加载器都无法找到该类),但 "破坏操作" 是不会成功的。因为 java.lang.Integer2 类没有 java.lang 包中任何类的访问权限!为什么没有访问权限呢?因为 java.lang 包中可信任的类和 java.lang.Integer2 不属于同一个运行时包。

 

运行时包:

由同一个类装载器装载的、属于同一个包的、多个类型的集合。

在允许两个类型之间对包内可见成员进行访问之前,虚拟机不但要确定这两个类型属于同一个包,还必须确认它们由同一个加载器加载。

类加载器

标签:自己的   字节流   java_home   父类   实现   c++   二进制   int   信任   

原文地址:https://www.cnblogs.com/miaooooo/p/12170351.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!