为了深入了解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机制 基本原则:为什么需要将Java文件和类文件切实安置到其所归属之Package所对应的相对路径下。 为什么要这样做呢?如果你在程序中,用到打包命令package,并且直接编译和执行该程序。
java-package与import机制 java-package与import机制
package与import机制 用Visual Studio.net来操控Java虚拟机 深入Java 2 SDK 深入类别载入器
Android_Package管理机制详解Package
package 机制 package是模块的集合,每一个Package的根目录下面都应当有一个__init__.py 文件。当解释器发现目录下有这个文件时,他就会认为这是一个Package,而不是一个普通的目录。 对于 package 机制的说明,...
Java深度历险\CH_05.package与import机制,看完之后,让您对加载的路径更清晰
兼容ros1 ros2自定义消息的cmakelists.txt文件与package.xml文件
package.json 在详细介绍vscode插件开发细节之前,这里我们先详细介绍一下vscode插件的package.json写法,但是建议先只需要随便看一下,了解个大概,等后面讲到具体细节的时候再回过头来看。 如下是package.json文件...
840D HMI Programming Package OEM画面开发软件 840D画面编写
Java深入历险(CH_05.package_与import_机制)
主要介绍了Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习...
与此相类似,为了不使class名称发生冲突,于是引入了package 进行管理。 所谓程序库就是一组class文件。其中每个文件都有一个public class,所以每个文件都以一个组件。如果你希望这些组件归属于一个 群组,便可以...
sublime插件使用所需Package Control.sublime-package文件
Package 包。只是在我们的app中这个Package是唯一的,就像你身份证号码一样。在我们做app自动化时,我们就需要知道他的Package,我们知道了Package那么也就知道我们需要对哪个app做自动化。 注意和.apk文件包名不同...
Package 和 "斯斯" 一?分?二?: ???入: 一般大家在用Delphi?都是使用『???入』, 像VCL的Package就是??方式, ??方式的好?是??者不用去理?Package 的?入及?放, 其???者根本感?不到有使用??技?; ?然您也可以手??...
Nature Package
word文档插入或者打开内嵌对象,出现下面的问题: 用于创建此对象的程序是 Package。您的计算机尚未安装此程序。 下载 packager 解压,把exe文件放到 C:\WINDOWS\system32 重启word就可以解决.
package control 和package control python