为了深入了解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并安装在自己的电脑上...
Android_Package管理机制详解Package
### Java深度历险:Chapter 05 - package与import机制 #### 前言 Java是一种广泛使用的编程语言,尤其适合于开发企业级应用。在Java编程的过程中,理解和掌握`package`与`import`机制至关重要。这两者是Java类加载...
package 机制 package是模块的集合,每一个Package的根目录下面都应当有一个__init__.py 文件。当解释器发现目录下有这个文件时,他就会认为这是一个Package,而不是一个普通的目录。 对于 package 机制的说明,...
本文将详细介绍如何在没有网络的情况下离线安装Sublime Text 3的Package Control及其Install Package功能。 首先,我们需要了解Package Control的工作原理。Package Control通过连接到其官方仓库(如channel_v3....
4. 及时更新插件,以保持与最新开发工具的兼容性。 总的来说,Package Control是Sublime Text生态的重要组成部分,它使得开发者能够更加便捷地管理和使用各种插件,从而提升开发效率和体验。而`channel_v3.json` 和...
Package Control Python则是指Package Control在运行过程中所依赖的Python环境,因为Sublime Text是用Python编写的,所以它的插件系统也与Python紧密相关。 首先,我们来详细了解一下Package Control。Package ...
《Kinect Wrapper Unity Package——深度探索与应用》 在当今的游戏和交互式应用程序开发领域,Unity引擎因其强大的功能和易用性而广受欢迎。而Kinect设备,作为微软推出的一款体感控制器,以其非接触式的交互方式...
本文旨在深入剖析DB2 UDB中的Package概念及其创建与绑定的过程,并结合DataDirect Connect for ODBC (32位) 和 DataDirect Connect64 for ODBC (64位) 驱动程序的具体使用案例来探讨其实际应用。 #### Package基础...
5. **配置与自定义**:用户可以通过修改Package Control的配置文件来定制其行为,比如设置代理、更改更新检查频率等,以适应不同的网络环境和个人偏好。 6. **社区支持**:Package Control的广泛使用促进了Sublime ...
《Unity C# 使用ExcelPackage读取与操作Excel文件详解》 在Unity开发中,处理Excel文件是一项常见的任务,尤其在游戏开发中,如资源管理、配置表存储等场景。ExcelPackage是一个强大的.NET库,它允许开发者在C#环境...
标签“8266_package_2.7”和“机智云”进一步确认了该软件包与ESP8266芯片的2.7版本相关,以及它与机智云平台的紧密联系。 在压缩包内的文件中,"8266_package_2.7.4.exe"很可能是一个Windows平台的安装程序,用户...
《Visual C++ 2015 Redistributable Package:C++ 运行时环境的关键组件》 Visual C++ 2015 Redistributable Package 是一个至关重要的软件组件,它是微软Visual Studio 2015开发环境的重要组成部分,主要用于部署...
package.json 在详细介绍vscode插件开发细节之前,这里我们先详细介绍一下vscode插件的package.json写法,但是建议先只需要随便看一下,了解个大概,等后面讲到具体细节的时候再回过头来看。 如下是package.json文件...
Oracle中的Package对象是一种独特的特性,它体现了Oracle数据库的面向对象编程理念。Package允许开发者像创建对象一样定义一组相关的过程、函数、类型以及全局变量,这些元素共享同一个命名空间,提高了代码的组织性...
这个压缩包“安卓Android源码——PackageInstaller.zip”包含的是Android系统的PackageInstaller模块的源代码,对于我们理解Android系统的应用管理机制具有重要价值。 PackageInstaller的主要功能包括: 1. **安装...