`

JavaClassLoader与Package机制

    博客分类:
  • JVM
阅读更多
为了深入了解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权限方法。
分享到:
评论

相关推荐

    package与import机制.pdf

    ### Package与Import机制详解 #### 一、基本概念与作用 **Package** 与 **Import** 是Java语言中用于组织类的重要机制。 - **Package**(包):用于组织类和接口的一种方式,有助于避免命名冲突,使得代码更加...

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

    总之,`package`和`import`机制为Java程序提供了良好的结构和可维护性,Visual Studio .NET提供了与JVM交互的便捷方式,而Java 2 SDK则为开发者提供了丰富的工具和资源。深入理解这些概念和工具,对于任何Java开发者...

    java-package与import机制

    ### Java Package与Import机制详解 #### 一、引言 对于很多刚开始接触Java编程的初学者来说,往往是从购买一本入门书籍开始他们的Java学习之旅。在这个过程中,他们可能会下载最新的Java SDK并安装在自己的电脑上...

    Android_Package管理机制详解

    Android_Package管理机制详解Package

    Java深度历险\CH_05.package与import机制

    ### Java深度历险:Chapter 05 - package与import机制 #### 前言 Java是一种广泛使用的编程语言,尤其适合于开发企业级应用。在Java编程的过程中,理解和掌握`package`与`import`机制至关重要。这两者是Java类加载...

    使用Python的package机制如何简化utils包设计详解

    package 机制 package是模块的集合,每一个Package的根目录下面都应当有一个__init__.py 文件。当解释器发现目录下有这个文件时,他就会认为这是一个Package,而不是一个普通的目录。 对于 package 机制的说明,...

    离线安装sublime text3 Package Control: Install Package

    本文将详细介绍如何在没有网络的情况下离线安装Sublime Text 3的Package Control及其Install Package功能。 首先,我们需要了解Package Control的工作原理。Package Control通过连接到其官方仓库(如channel_v3....

    Package Control.sublime-package

    4. 及时更新插件,以保持与最新开发工具的兼容性。 总的来说,Package Control是Sublime Text生态的重要组成部分,它使得开发者能够更加便捷地管理和使用各种插件,从而提升开发效率和体验。而`channel_v3.json` 和...

    package control 和package control python

    Package Control Python则是指Package Control在运行过程中所依赖的Python环境,因为Sublime Text是用Python编写的,所以它的插件系统也与Python紧密相关。 首先,我们来详细了解一下Package Control。Package ...

    Kinect Wrapper Unity Package

    《Kinect Wrapper Unity Package——深度探索与应用》 在当今的游戏和交互式应用程序开发领域,Unity引擎因其强大的功能和易用性而广受欢迎。而Kinect设备,作为微软推出的一款体感控制器,以其非接触式的交互方式...

    package in db2.pdf

    本文旨在深入剖析DB2 UDB中的Package概念及其创建与绑定的过程,并结合DataDirect Connect for ODBC (32位) 和 DataDirect Connect64 for ODBC (64位) 驱动程序的具体使用案例来探讨其实际应用。 #### Package基础...

    完整版Package Control.zip

    5. **配置与自定义**:用户可以通过修改Package Control的配置文件来定制其行为,比如设置代理、更改更新检查频率等,以适应不同的网络环境和个人偏好。 6. **社区支持**:Package Control的广泛使用促进了Sublime ...

    ExcelPackage_ExcelPackage_unityC#Excel_源码

    《Unity C# 使用ExcelPackage读取与操作Excel文件详解》 在Unity开发中,处理Excel文件是一项常见的任务,尤其在游戏开发中,如资源管理、配置表存储等场景。ExcelPackage是一个强大的.NET库,它允许开发者在C#环境...

    8266_package_2.7.4.zip

    标签“8266_package_2.7”和“机智云”进一步确认了该软件包与ESP8266芯片的2.7版本相关,以及它与机智云平台的紧密联系。 在压缩包内的文件中,"8266_package_2.7.4.exe"很可能是一个Windows平台的安装程序,用户...

    Visual C++ 2015 Redistributable Package

    《Visual C++ 2015 Redistributable Package:C++ 运行时环境的关键组件》 Visual C++ 2015 Redistributable Package 是一个至关重要的软件组件,它是微软Visual Studio 2015开发环境的重要组成部分,主要用于部署...

    VSCode插件开发全攻略之package.json详解

    package.json 在详细介绍vscode插件开发细节之前,这里我们先详细介绍一下vscode插件的package.json写法,但是建议先只需要随便看一下,了解个大概,等后面讲到具体细节的时候再回过头来看。 如下是package.json文件...

    Oracle中的package对象

    Oracle中的Package对象是一种独特的特性,它体现了Oracle数据库的面向对象编程理念。Package允许开发者像创建对象一样定义一组相关的过程、函数、类型以及全局变量,这些元素共享同一个命名空间,提高了代码的组织性...

    安卓Android源码——PackageInstaller.zip

    这个压缩包“安卓Android源码——PackageInstaller.zip”包含的是Android系统的PackageInstaller模块的源代码,对于我们理解Android系统的应用管理机制具有重要价值。 PackageInstaller的主要功能包括: 1. **安装...

Global site tag (gtag.js) - Google Analytics