Java安全——类加载器

Java安全

Java类装载器

Java类加载器提供了以下机制:

  1. 加载类:类加载器通过查找和定位类的字节码,将类加载到Java虚拟机中。
  2. 连接类:连接类包括验证、准备和解析三个阶段。验证阶段是验证字节码是否符合Java虚拟机规范;准备阶段是为类的静态变量分配内存并设置默认初始值;解析阶段是将符号引用转换为直接引用。
  3. 初始化类:当类被加载到Java虚拟机中后,需要执行类的静态代码块,并初始化类的静态变量。
  4. 对象实例化:类加载器还可以实例化对象,并为对象分配内存空间。
  5. 类的卸载:当类不再被使用时,类加载器可以将其卸载,释放内存空间,从而提高Java虚拟机的性能。

总的来说,Java类加载器提供了将类加载到Java虚拟机中的功能,通过连接、初始化和卸载等阶段,实现了Java程序的动态加载和卸载机制。

类加载器主要说明
  • 提供将类字节码文件读入java虚拟机并转换为类定义形式
  • 类加载器可以结合虚拟机的定义名称空间,以此保护java语言本身安全特性的完整性
  • 类加载器在必要的时候调用安全管理器,从而保证代码在定义和访问类时有适当的权限
  • 类加载器建立了权限与类对象(每个类的保护域)之间的映射,这样存取管理器就知道哪些类拥有哪些权限
虚拟机定义的名称空间

Java虚拟机定义了三个名称空间来管理类的加载:引导类加载器、扩展类加载器和应用程序类加载器。每个加载器都有自己的类加载器名称空间,用于隔离加载的类和其它资源。

类加载器实现了双亲委派机制,即当一个类需要被加载时,它首先会委托它的父类加载器寻找该类,如果父类加载器无法找到该类,它会再委托它自己的子类加载器寻找该类,以此类推。这种机制可以避免同一个类被重复加载,从而保证类的唯一性和一致性。

在这种机制下,类加载器和虚拟机的名称空间可以相互结合,保证了类的唯一性和一致性,同时还能够隔离不同类加载器加载的类和其它资源。例如,应用程序类加载器只能加载应用程序的类,而不能加载引导类或扩展类中的类,这保证了应用程序的安全性和稳定性。

类加载器调用安全管理器

类加载器在加载应用程序时,可能需要涉及到一些安全性检查,例如检查访问权限、文件权限、代码签名等。为了保证应用程序的安全性,Java虚拟机提供了安全管理器(Security Manager)来进行安全性检查,类加载器在必要的时候会调用安全管理器进行检查。

安全管理器是一个Java类,它实现了Java安全性模型中的安全策略,控制访问权限、文件权限、网络权限等。当类加载器需要进行安全性检查时,它会调用安全管理器的相应方法来获取访问权限、文件权限、网络权限等信息。

例如,当类加载器需要读取本地文件时,它会调用安全管理器的checkRead()方法来检查是否有读取文件的权限。如果安全管理器不允许读取该文件,类加载器将抛出SecurityException异常。类加载器还可以调用安全管理器的其他方法,如checkPermission()checkConnect()等,来获取访问权限、网络权限等信息。

类加载器建立权限和类之间的关系映射

类加载器在加载类的过程中,会根据类的名字和其他一些信息(例如包名)计算出一个唯一的标识符,并且将这个标识符和对应的类对象(包括类的保护域)保存到内存中。当应用程序需要访问某个类的成员(例如静态方法、静态变量等)时,存取管理器会检查当前线程的访问权限,并使用类加载器保存的映射关系确定该类的访问权限。

例如,假设应用程序需要访问com.example.MyClass类的静态变量myField,类加载器会先计算出com.example.MyClass类的唯一标识符,并根据标识符找到对应的类对象和保护域。然后,存取管理器会检查当前线程是否有访问该类和该变量的权限,如果有,就允许访问;如果没有,就抛出SecurityException异常。

因此,类加载器建立了权限与类对象之间的映射,并将这些映射关系保存在内存中,这样存取管理器就可以根据这些映射关系来判断哪些类拥有哪些权限。这种机制可以在Java虚拟机中实现安全性管理,保证应用程序不会访问不应有的资源或执行不应有的操作。

类加载器中的类和方法执行说明

类装载器是 Java 应用程序运行时的一个重要组成部分,主要作用是将类文件加载到 Java 虚拟机中并生成 Java 类型对象。在 Java 中,类装载器主要分为三种:Bootstrap ClassLoader、Extension ClassLoader和System ClassLoader。

  1. Bootstrap ClassLoader Bootstrap ClassLoader(引导类加载器)是 JVM 内置的类加载器,用来加载 Java 核心类库和扩展 API 等核心功能。它是 Java 类型系统中最为基础的一层,是 JVM 的一部分。Bootstrap ClassLoader 无法通过 Java 编写,因为它不是普通的 Java 类,而是用 C++ 语言编写的。Bootstrap ClassLoader 加载的类文件是 Java 核心类库和扩展 API。
  2. Extension ClassLoader Extension ClassLoader(扩展类加载器)是 Bootstrap ClassLoader 的子类,负责加载 Java 应用程序扩展的 API。它的加载路径是 Java 的安装目录下的 jre/lib/ext 目录。如果在 Java 启动时加入 -Djava.ext.dirs 参数,可以让 Extension ClassLoader 加载指定的扩展路径中的类文件。
  3. System ClassLoader System ClassLoader(系统类加载器)也称为应用程序类加载器,负责加载应用程序的类文件。它会优先加载 ClassPath 中的类,如果没有找到再去加载扩展类和引导类的类文件。System ClassLoader 可以通过 ClassLoader.getSystemClassLoader() 方法获取。

类装载器和安全管理的执行步骤如下:

  1. 首先,类加载器获取要加载的类的二进制文件字节码。
  2. 接着,类加载器将这些字节码转换成 JVM 中的一个 class 对象。
  3. 类加载器会检查这个类是否已经被加载,如果没有被加载,则会进行类加载的操作。
  4. 在类加载的过程中,安全管理器会对该操作进行检查,确保该类可以被加载,并且该类的加载不会带来安全问题。
  5. 如果检查通过,类加载器会将字节码文件加载到内存中,并生成 Java 类型对象。
  6. 链接该类文件,包括验证、准备、解析等步骤。
  7. 类加载器返回这个类的 class 对象,供程序使用。
  8. 在程序执行过程中,如果要调用该类的某个方法,安全管理器也会对该调用进行检查,确保该操作是安全的。如果检查通过,则方法被执行,否则操作将会被拒绝。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P("Struggler") ?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值