内容简介:Java中有三种基础的类加载器 BootStrap、Extension、System他们都有一个职能,就是从不同的包中加载类。但是一个类加载器完全可以加载所有的类,为什么要有3种基础的类型的类加载器呢?
Java中有三种基础的类加载器 BootStrap、Extension、System
他们都有一个职能,就是从不同的包中加载类。
但是一个类加载器完全可以加载所有的类,为什么要有3种基础的类型的类加载器呢?
最佳答案
Java中有三种基础的类加载器主要为了安全。
1.2版本的JVM中,只有一个类加载器,就是现在的“Bootstrap”类加载器。
类加载器加载类的方式是,加载器先调用父加载器对类进行加载,如果父加载器找不到该类,此加载器才会去加载该类。
最关键的是, 除非是同一个类加载器加载的类 ,否则JVM不会保证包访问级别(如果不指明private/public或protected,则方法和属性具有包访问级别)。
因此,假如用户调用他编写的java.lang.MyClass类。理论上该类可以访问和改变java.lang包下其他类的默认访问修饰符的属性和方法的能力。Java语言本身并没有阻止这种行为。但是JVM则会阻止这种行为,因为 java 核心类库的java.lang包下的类是由bootstrap类加载器加载的。不是同一个类加载器加载的类等于不具有包级别的访问权限。
类加载器中的其他安全特性也会阻止这种类型侵入。
所以为什么有三种基础的类加载器?是因为他们代表三种不同的信任级别。最可信的级别是java核心API类。然后是安装的拓展类,最后才是在类路径中的类(属于你本机的类)。
想了解更多详情,参见:Why Security?
其他解释1
类加载主要的应用场景是在应用服务器上。
如果你想启动Tomcat。这至少需要一个类加载器来运行Tomcat自己。
然后你想在Tomcat容器中部署项目。因此Tomcat需要加载和分析甚至在Tomcat启动前都不存在的类。
然后你又想在Tomcat中部署另外一个应用。 第二个应用可能也会用到第一个应用使用的库,但是版本不同。
因此你就需要每个应都有相互隔离的类加载器,否则第二个应用的类可能会覆盖第一个应用之前加载的类,从而造成一些意想不到的后果。
然后你想停掉某个web应用。该应用的类加载器应该会被销毁,垃圾也随之被回收,这样可以避免内存泄露。
或许类加载器还有其他用途,但这是我印象中最常见的用法。
其他解释2
- 多种类加载器待办可以同时加载多个应用程序(一个加载服务,另外的加载器用来服务器内部的部署)。
- 每种加载器都有对应的层级来加载某些特定的类,来保证他们之间的安全性。英文原文: What is the reason for having 3 Class loaders in Java - LonelyCoding
引言
Java中有三种基础的类加载器 BootStrap, Extension and System
他们都有一个职能,就是从不同的包中加载类。
但是一个类加载器完全可以加载所有的类,为什么要有3种基础的类型的类加载器呢?
最佳答案
Java中有三种基础的类加载器主要为了安全。
1.2版本的JVM中,只有一个类加载器,就是现在的“Bootstrap”类加载器。
类加载器加载类的方式是,加载器先调用父加载器对类进行加载,如果父加载器找不到该类,此加载器才会去加载该类。
最关键的是, 除非是同一个类加载器加载的类 ,否则JVM不会保证包访问级别(如果不指明private/public或protected,则方法和属性具有包访问级别)。
因此,假如用户调用他编写的java.lang.MyClass类。理论上该类可以访问和改变java.lang包下其他类的默认访问修饰符的属性和方法的能力。Java语言本身并没有阻止这种行为。但是JVM则会阻止这种行为,因为java核心类库的java.lang包下的类是由bootstrap类加载器加载的。不是同一个类加载器加载的类等于不具有包级别的访问权限。
类加载器中的其他安全特性也会阻止这种类型侵入。
所以为什么有三种基础的类加载器?是因为他们代表三种不同的信任级别。最可信的级别是java核心API类。然后是安装的拓展类,最后才是在类路径中的类(属于你本机的类)。
想了解更多详情,参见:Why Security?
其他解释1
类加载主要的应用场景是在应用服务器上。
如果你想启动Tomcat。这至少需要一个类加载器来运行Tomcat自己。
然后你想在Tomcat容器中部署项目。因此Tomcat需要加载和分析甚至在Tomcat启动前都不存在的类。
然后你又想在Tomcat中部署另外一个应用。 第二个应用可能也会用到第一个应用使用的库,但是版本不同。
因此你就需要每个应都有相互隔离的类加载器,否则第二个应用的类可能会覆盖第一个应用之前加载的类,从而造成一些意想不到的后果。
然后你想停掉某个web应用。该应用的类加载器应该会被销毁,垃圾也随之被回收,这样可以避免内存泄露。
或许类加载器还有其他用途,但这是我印象中最常见的用法。
以上所述就是小编给大家介绍的《为什么Java中有三种基础的类加载器?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Spring Boot 基础系列:实现一个自定义配置加载器(应用篇)
- Spring Boot 基础系列:实现一个自定义配置加载器(应用篇)
- Spring Cloud Alibaba基础教程:Nacos配置的加载规则详解
- 每周10道Java面试题:面向对象, 类加载器, JDBC, Spring 基础概念
- Spring Cloud Alibaba基础教程:Nacos配置的多文件加载与共享配置
- 介绍同步加载、异步加载、延迟加载[原创]
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
离散数学及其应用(英文版·第5版)
Kenneth H.Rosen / 机械工业出版社 / 2003 / 79.00元
本书第4版是全球500多所大学的指之一教材,获得了极大的成功。中文版也已被国内大学广泛有用为教材。第5版在前四版的基础上做了大量的改进,使其成为更有效的教学工具。 本书可作为1至2个学期的离散数学课入门教材,适用于数学、计算机科学、工程等专业的学生。一起来看看 《离散数学及其应用(英文版·第5版)》 这本书的介绍吧!