探讨JavaClassLoader与Package机制

原创 2007年10月03日 23:29:00

为了深入了解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权限方法。

 
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java的package和import机制

====================================================== 注:本文源代码点此下载 =============================...

python Import机制备忘-模块搜索路径(sys.path)、嵌套Import、package Import

python Import机制备忘-模块搜索路径(sys.path)、嵌套Import、package Import   转自 hzr163_2004的博客   2009-03-11 15:09:30...

Java的import和package机制

在编译的java源文件(.java)时,编译器会根据环境变量或者javac的-cp属性指出的参数建立类路径引用表。其中环境变量和-cp参数不会叠加,如果指定了cp参数,环境变量将失效。如果两者都没有,...

android Html Package机制说明

术语说明                        &#...

Python Import机制备忘-模块搜索路径(sys.path)、嵌套Import、package Import

Python Import机制备忘-模块搜索路径(sys.path)、嵌套Import、package Import 分类: Python 2008-11-26 18:16 2168...

java的package和import机制

一直通过互联网得到帮助,我也好想能通过互联网回报大家。 最近在看java方面的书籍。刚开始对package和import的机制不是很明白,网上找了很多的资料,发现也说得比较专业,对于基础一般的同学没...

Java_package和import机制

本博文为子墨原创,转载请注明出处! http://blog.csdn.net/zimo2013/article/details/8913389 1.package和import机制     ...

Java的ClassLoader与Package机制

为了深入了解Java的ClassLoader机制,我们先来做以下实验: package java.lang; public class Test {     public static void m...

Android “original-package” 机制解析

目录1 问题 2 问题情况 3 初步分析 4 深入分析 original-package 作用 5 深入分析 original-package 机制 6 总结 问题之前项目上遇到一个问题:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)