`
liyanhui
  • 浏览: 349273 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java语言中的ClassLoader与Package机制

    博客分类:
  • java
阅读更多
转自中文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权限方法。
为了深[b]
分享到:
评论
1 楼 silence406 2008-11-12  
那最后说的情况,要使用java反射机制呢!
可不可能实现?
我怎么查看那个类加载在那个加载器中呢?

相关推荐

    java深度历险 详细讲解了java的package机制等

    在Java编程语言中,`package`和`import`机制是构建大型、模块化代码库的关键要素,它们有助于组织和管理类以及确保代码的可重用性。本篇将深入探讨这两个概念,以及如何通过Visual Studio .NET来操控Java虚拟机(JVM...

    java自定义类加载classloader文档,包括代码

    在Java语言中,类加载机制是其动态特性的核心之一。通过类加载器(Class Loader),Java程序能够在运行时根据需要加载所需的类,从而实现高度的灵活性与可扩展性。本文将深入探讨Java中的类加载机制,并通过一个具体...

    Java语言程序设计.pdf

    Java语言的设计理念是尽可能减少编程语言的复杂性,同时保持“一次编写,到处运行”的功能。其背后的设计哲学在于“简单、面向对象、健壮、跨平台、安全性、多线程和动态性”。 Java语言程序设计涉及的核心知识点...

    同一个package的类型分散在不同JAR包中

    包是Java语言的一个重要特性,用于对类进行命名空间的管理,防止类名冲突。例如,`java.util`、`javax.swing`等都是我们熟知的包,它们包含了相应的类和接口。在实际开发中,一个包下的类可能会分布在多个物理文件或...

    java反射机制与动态代理

    Java反射机制是Java语言的一种强大的工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。动态代理则是基于反射机制实现的一种高级功能,可以为已存在的类创建代理对象,实现在运行时对方法...

    JAVA手机程序入门2

    Java的包机制(Package Mechanism)是Java语言为了支持大型项目管理和组织代码而设计的一个重要特性。它允许开发者将类、接口等Java元素分组到不同的命名空间中,从而避免命名冲突,提高代码的可读性和维护性。 **...

    java深度历险java底层

    在Java编程语言的世界里,深入了解其底层机制是提升开发能力和优化代码的关键。本文将带你深入探索Java的包管理、类加载器以及import等核心概念,帮助你更好地理解Java运行时环境的工作原理。 1. **包管理**: ...

    java rt包源代码

    9. **国际化与本地化**:`java.util.Locale`类用于表示语言、国家和区域的组合,`ResourceBundle`类用于加载不同地区的资源文件,支持应用程序的国际化和本地化。 10. **内存管理**:虽然Java RT包不直接提供内存...

    JAVA面试题,Java是一种面向对象的编程语言,由Sun Microsystems公司(现属Oracle公司)于1995年推出

    Package是Java的命名空间管理机制,用于组织和分类类和接口,避免命名冲突。通过使用包,开发者可以创建清晰的类层次结构,便于管理和维护代码。 Object类是所有Java类的基类,包含了一些通用的方法,如toString()...

    Java学习思路.pdf

    JDK(Java Development Kit)是学习Java语言的首要工具,它包括了Java运行环境(Java Runtime Environment,JRE)、核心类库以及Java工具(如编译器javac和调试器jdb)。在学习Java时,首先要掌握JDK的安装和配置,...

    Java 基础核心总结.pdf

    3. **包和导入**:Java使用包(package)进行模块化管理,例如`java.util`包包含许多实用工具类。`import`语句用于引入特定包中的类,如`import java.util.*`导入整个`java.util`包。 4. **类和对象**:Java是一种...

    Java Source Learning

    "Java Source Learning"这个主题旨在探讨Java语言的源码,帮助开发者从底层原理出发,更好地掌握这门强大的编程语言。通过阅读和分析源码,我们可以揭示Java运行机制的奥秘,理解其设计思想,并学习如何运用这些知识...

    Java虚拟机工作原理详解.doc

    这种机制确保了类的唯一性,因为类的完整标识是(classLoader,package,className)。例如,同一个类可以被不同类加载器加载,但每个加载器只会加载一次。 类加载后,JVM会进行验证(Verifying)、准备(Preparing...

    JAVA知识点

    根据提供的上课笔记,我们可以深入探讨Java的一些核心概念与特点,并且整理出一系列重要的知识点: ### Java 安装环境配置 ...以上是对Java基础知识点的梳理与总结,这些内容对于理解和掌握 Java 语言至关重要。

    java反射机制原理详解.docx

    Java反射机制是Java语言提供的一种强大的工具,它允许程序在运行时动态地获取类的信息以及对类的对象进行操作。在Java中,一切皆为对象,类也不例外。`java.lang.Class`类是反射的起点,它代表了Java运行时的类信息...

    java-lang包详解

    在Java编程语言中,`java.lang`包是所有Java程序的基础,因为它包含了许多核心类和接口,这些类和接口是编写任何Java应用程序所必需的。由于这个包是自动导入的,因此程序员无需在代码中显式地导入`java.lang`。 1....

Global site tag (gtag.js) - Google Analytics