当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:12:00  来源:本站整理

Java的ClassLoader与Package机制[Java编程]

赞助商链接



  本文“Java的ClassLoader与Package机制[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

为了深化理解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的ClassLoader与Package机制[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • 利用Javascript实现网页水印(非图片水印)
  • Java开辟环境的搭建
  • Ubuntu java安装与配置
  • 办理Ubuntu 10.04 Firefox3.6 Java浏览器插件不工作的问
  • Ubuntu重装后Java环境的设置
  • Sun Java进入Ubuntu 10.10软件中央
  • Ubuntu 10.10配置Java开辟环境
  • 在Ubuntu 10.10中配置Java环境变量的办法
  • Ubuntu下Java环境的搭建
  • Ubuntu 10.04 下安装 Java, JRE
  • Ubuntu 10.04下的搭建SUN JAVA开辟环境
  • Ubuntu 12.04安装java7
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .