探讨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权限方法。

 

Android平台Camera实时滤镜实现方法探讨(七)--滤镜基本制作方法(一)

本篇简单介绍一些滤镜的制作方法
  • oShunz
  • oShunz
  • 2015年12月08日 09:13
  • 5764

手机管理应用研究【1】——总篇

说明 由于自己一直以来对手机管理方面的东西比较感兴趣,加上最近以来老大的驱动,所以决定研究整理一下root相关技术(不局限于root)。手机Root是一门大学问,root的招数各有不同。Root权...
  • zhgxhuaa
  • zhgxhuaa
  • 2014年07月22日 15:33
  • 2472

Android平台Camera实时滤镜实现方法探讨(一)--JNI操作Bitmap

众所周知,通过setPreviewHolder可以将预览数据显示在一个SurfaceView上,即可实现相机拍照时的预览功能,通过添加各个控件和接口即可实现简单相机应用,但如果需要对预览画面进行处理,...
  • oShunz
  • oShunz
  • 2015年11月16日 10:20
  • 9537

Java深入历险(CH_05.package_与import_机制)

  • 2012年02月17日 16:05
  • 497KB
  • 下载

Java中利用package机制实现条件编译

http://www.cnblogs.com/phinecos/archive/2010/03/15/1685965.html
  • wangkaiblog
  • wangkaiblog
  • 2014年09月23日 20:30
  • 430

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

Python Import机制备忘-模块搜索路径(sys.path)、嵌套Import、package Import 分类: Python 2008-11-26 18:16 2168...
  • u014365655
  • u014365655
  • 2014年08月12日 13:41
  • 238

java的package和import机制

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

Java中利用package机制实现条件编译

Java中并没有C语言里的“条件编译”特性。这种特性在C语言里是用来解决代码的跨平台问题的,可以通过让代码的不同部分根据其运行的具体平台进行编译。由于Java本身就设计为一种跨平台的语言,因此这种特性...
  • hjyresdggsd
  • hjyresdggsd
  • 2014年10月12日 13:35
  • 151

Java的package和import机制

====================================================== 注:本文源代码点此下载 =============================...
  • javazhuanzai
  • javazhuanzai
  • 2012年02月01日 00:35
  • 121

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

python Import机制备忘-模块搜索路径(sys.path)、嵌套Import、package Import   转自 hzr163_2004的博客   2009-03-11 15:09:30...
  • zhoujianli12
  • zhoujianli12
  • 2011年08月08日 22:16
  • 363
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:探讨JavaClassLoader与Package机制
举报原因:
原因补充:

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