JavaClassLoader与Package机制

2016-02-19 20:06 4 1 收藏

在这个颜值当道,屌丝闪边的时代,拼不过颜值拼内涵,只有知识丰富才能提升一个人的内在气质和修养,所谓人丑就要多学习,今天图老师给大家分享JavaClassLoader与Package机制,希望可以对大家能有小小的帮助。

【 tulaoshi.com - 编程语言 】

  为了深入了解Java的ClassLoader机制,我们先来做以下实验:

  
  public class Test {
      public static void main(String[] args) {
          char[] c = "1234567890".toCharArray();
          String s =     }
  }

  String类有一个Package权限的构造函数String(int offset, int length, char[] array),按照默认的访问权限,由于Test属于java.lang包,因此理论上应该可以访问String的这个构造函数。编译通过!执行时结果如下:

  Exception in thread "main" : 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)

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  希奇吧?要弄清为什么会有SecurityException,就必须搞清楚ClassLoader的机制。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  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都可以访问。但是这还不够准确。确切的说,比如启动类装载器装载了java.lang.String,类路径装载器装载了我们自己写的java.lang.Test,它们不能互相访问对方具有Package权限的方法。这样就阻止了恶意代码访问核心类的Package权限方法。


来源:https://www.tulaoshi.com/n/20160219/1622759.html

延伸阅读
Java与C#的事件处理都是实现了事件源-事件响应者机制,但又不完全相同。Java实现的是一种事件源与事件响应者两级实体对象方式,这里的事件响应者也是事件监听者,而C#实现的是一种事件源-代理-事件响应者三级实体对象方式。下面就这两种方式来具体说明。 Java事件处理 从概念上讲,事件是一种在"源对象"和"监听者...
标签: SQLServer
摘要 :本文介绍了在客户机上处理 Microsoft SQL Server 查询的方式,各种客户机与 SQL Server 的交互方式,以及 SQL Server 在处理客户机程序的请求时需要完成的工作。 简介 Microsoft(R) SQL Server(TM) 内部机制和结构是一个非常大的主题,因此本文仅限于程序开发人员感兴趣的问题,集中研究其他源中没有彻底讨论的问题。在讨论 SQL ...
机制馒头 馒头,又称之为馍、馍馍(仅限于晋语、闽方言有此称呼,馍字是后造字,有人认为馍字来源于馒字在早先晋语的读音。关中、中原等地称之为馍),中国传统面食,以面粉和水发酵后蒸制而成,外形通常是半球形、长方体,大小从直径4厘米左右到直径15厘米左右均有。中国北方传统上以馒头(华北、东北、西北...小编想用一道美食跟各位吃货们教个朋友噢!...
标签: SQLServer
把计划放入缓存之后,SQL Manager 按照执行要求逻辑进行检查,确定是否有更改的内容,是否需要重新编译。即使编译到执行之间时间间隔只有几毫秒,也可能有人会执行一条数据定义语句 (DDL),为关键的表加了索引。这种可能性不大,但是确实存在,因此 SQL Server 必须考虑这一点。有几种情况 SQL Server 必须重新编译存储规划。元数据的修改,例...
《龙腾世纪2》对话图示与对话系统运作机制 交涉 交涉型风格的关键选项。很少会造成冒犯,可能会增加友好值。 帮助 交涉型风格的一种。 通常出现在Hawke 自告奋勇帮助别人或是需要怜悯和同理心的场合。 幽默 幽默型风格的关键选项。很少会造成冒犯,对同伴来说是一个接近完全中立的选项, 不过有时候可以得到Isabela 和V...

经验教程

394

收藏

14
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部