为了深入了解Java的ClassLoader机制,我们先来做以下实验:
package java.lang;
public class Test {
public static void main(String[] args) {
char[] c = "1234567890".toCharArray();
String s = new String(0, 10, c);
}
}
String类有一个Package权限的构造函数String(int offset, int length, char[] array),按照默认的访问权限,由于Test属于java.lang包,因此理论上应该可以访问String的这个构造函数。编译通过!执行时结果如下:
Exception in thread "main" java.lang.SecurityException: Prohibited package name:
java.lang
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
奇怪吧?要弄清为什么会有SecurityException,就必须搞清楚ClassLoader的机制。
Java的ClassLoader就是用来动态装载class的,ClassLoader对一个class只会装载一次,JVM使用的ClassLoader一共有4种:
启动类装载器,标准扩展类装载器,类路径装载器和网络类装载器。
这4种ClassLoader的优先级依次从高到低,使用所谓的“双亲委派模型”。 确切地说,如果一个网络类装载器被请求装载一个java.lang.Integer,它会首先把请求发送给上一级的类路径装载器,如果返回已装载,则网络 类装载器将不会装载这个java.lang.Integer,如果上一级的类路径装载器返回未装载,它才会装载java.lang.Integer。
类 似的,类路径装载器收到请求后(无论是直接请求装载还是下一级的ClassLoader上传的请求),它也会先把请求发送到上一级的标准扩展类装载器,这 样一层一层上传,于是启动类装载器优先级最高,如果它按照自己的方式找到了java.lang.Integer,则下面的ClassLoader 都不能再装载java.lang.Integer,尽管你自己写了一个java.lang.Integer,试图取代核心库的 java.lang.Integer是不可能的,因为自己写的这个类根本无法被下层的ClassLoader装载。
再说说Package权限。Java语言规定,在同一个包中的class,如果没有修饰符,默认为Package权限,包内的class都可以访问。但是这还不够准确。确切的说,只有由同一个ClassLoader装载的class才具有以上的Package权限。比如启动类装载器装载了java.lang.String,类路径装载器装载了我们自己写的java.lang.Test,它们不能互相访问对方具有Package权限的方法。这样就阻止了恶意代码访问核心类的Package权限方法。
相关推荐
### Package与Import机制详解 #### 一、基本概念与作用 **Package** 与 **Import** 是Java语言中用于组织类的重要机制。 - **Package**(包):用于组织类和接口的一种方式,有助于避免命名冲突,使得代码更加...
总之,`package`和`import`机制为Java程序提供了良好的结构和可维护性,Visual Studio .NET提供了与JVM交互的便捷方式,而Java 2 SDK则为开发者提供了丰富的工具和资源。深入理解这些概念和工具,对于任何Java开发者...
### Java Package与Import机制详解 #### 一、引言 对于很多刚开始接触Java编程的初学者来说,往往是从购买一本入门书籍开始他们的Java学习之旅。在这个过程中,他们可能会下载最新的Java SDK并安装在自己的电脑上...
### Java深度历险:Chapter 05 - package与import机制 #### 前言 Java是一种广泛使用的编程语言,尤其适合于开发企业级应用。在Java编程的过程中,理解和掌握`package`与`import`机制至关重要。这两者是Java类加载...
Android_Package管理机制详解Package
package 机制 package是模块的集合,每一个Package的根目录下面都应当有一个__init__.py 文件。当解释器发现目录下有这个文件时,他就会认为这是一个Package,而不是一个普通的目录。 对于 package 机制的说明,...
本文旨在深入剖析DB2 UDB中的Package概念及其创建与绑定的过程,并结合DataDirect Connect for ODBC (32位) 和 DataDirect Connect64 for ODBC (64位) 驱动程序的具体使用案例来探讨其实际应用。 #### Package基础...
import与package机制的探讨:撰写Java程序的人,绝对会遇到import与package机制。只要明白这个机制的运作原理,你会发现Java是一个设计优良的设计;Ant与Java;Java与Office;Visual Studio.net与Java;Java 2 SDK源...
《Kinect Wrapper Unity Package——深度探索与应用》 在当今的游戏和交互式应用程序开发领域,Unity引擎因其强大的功能和易用性而广受欢迎。而Kinect设备,作为微软推出的一款体感控制器,以其非接触式的交互方式...
import与package机制的探讨:撰写Java程序的人,绝对会遇到import与package机制。只要明白这个机制的运作原理,你会发现Java是一个设计优良的设计;Ant与Java;Java与Office;Visual Studio.net与Java;Java 2 SDK源...
4. 及时更新插件,以保持与最新开发工具的兼容性。 总的来说,Package Control是Sublime Text生态的重要组成部分,它使得开发者能够更加便捷地管理和使用各种插件,从而提升开发效率和体验。而`channel_v3.json` 和...
本文将详细介绍如何在没有网络的情况下离线安装Sublime Text 3的Package Control及其Install Package功能。 首先,我们需要了解Package Control的工作原理。Package Control通过连接到其官方仓库(如channel_v3....
在本"unity2018 package manager引入本地包Demo"中,我们将探讨如何利用Package Manager来导入存储在本地的软件包,而不必依赖于Unity Asset Store或其他远程源。 首先,了解Package Manager的基本概念是至关重要的...
"以Delphi Package架構多人開發應用程式環境.pdf"这个文档深入探讨了如何利用包来构建多人协作的开发环境。这包括版本控制、接口定义、依赖管理等方面,确保团队成员之间的工作能够无缝对接。 至于其他文件,如...
Package Control Python则是指Package Control在运行过程中所依赖的Python环境,因为Sublime Text是用Python编写的,所以它的插件系统也与Python紧密相关。 首先,我们来详细了解一下Package Control。Package ...
下面我们将深入探讨Package Control的工作原理、安装方法以及如何利用它来增强Sublime Text的功能。 1. **Package Control的工作原理** Package Control通过一个内置的包管理器,允许用户在Sublime Text中搜索、...
5. **配置与自定义**:用户可以通过修改Package Control的配置文件来定制其行为,比如设置代理、更改更新检查频率等,以适应不同的网络环境和个人偏好。 6. **社区支持**:Package Control的广泛使用促进了Sublime ...