zoukankan      html  css  js  c++  java
  • 8.1.10装载约束

    8.1.10装载约束

    Java类型可以符号化地引用常量池中的其他类型,解析时需要特别关照,当存在多个类装载 器的时候,要保证类型安全。当一个类型包含指向另一个类型中的字段的符号引用时,符号引 用包含一个描述符——它指明了该字段的类型。当一个类型包含指向另外一个类型的方法的符 号引用时,符号引用也包含一个描述符——它指明了返回值的类型和参数(如果有参数的话)。 如果引用的类型和被引用类型并非由同一个初始装载器装载,虚拟机必须确保在字段或者方法 描述符中提及的类型在不同的命名空间中保持一致。比如说,假设类Cat包含指向在类Mouse中 声明的字段和方法的符号引用,两个不同的类装载器分别初始装载了Cat和Mouse。为了保证存 在多个类装载器时类型的安全,虚拟机必须保证,Cat中包含的字段和方法描述符所提及的类型 的全限定名,必须和类Mouse中同样的名字指向同一类型数据(在方法区中)。(自我感悟:也就是必须这两个相同类型必须由同一定义类装载器装载)。

    为了确保Java虚拟机实现能够保证类型在不同命名空间保持一致性.Java虚拟机规范第2版 定义了几种装载约束。每一个Java虚拟机都必须维护一个有关这些约束的内部列表,每一个约束 基本上都表明了一个命名空间中的某个名字必须和另一个命名空间中的同一个名字指向同一类 型数据。无论何时Java虚拟机遇到某些指向被引用类型的字段和方法的符号引用,且被引用类型 的初始装载并非是初始装载引用类型的同一个类装载器,虚拟机就会在列表中加上一个约束。(自我感悟:运行时) 虚拟机在解析符号引用的时候必须检查当前已经装载的所有约束。

    为了描述装载约束,符号<C, Ld>li用来表示类型。C表示类型的全限定名,Ld表示类型的定义类装载器,Li表示类型的初始类装载器。如果不讨论定义类装载器,简化用Cli来表示类型和它 的初始类装载器。如果不讨论初始类装载器,简化用<C, Ld>表示类型和它的定义类装载器。在 两个类型之间的等于符号,表示两个类型实际上是同样的类型,表示方法区的同一段类型数据。

    有了这些符号,产生装载约束的规则表示如下:

    •当解析一个包含在<C,L1>中的符号引用(它指向的是类<D, L2>中声明的类型T的字段) 时,虚拟机必须产生下列装载约束:

    TL1=TL2

    •当解析一个包含在<C,Ll>中的符号引用(它指向的是一个方法,其返回值是T0类型,其参数是(T1,…,Tn)类型,在类<D,L2>中声明)时,虚拟机必须产生下列装载约束:

    T0Ll=T0L2,...,TnLl=TnL2

    •当<C,Ll>重载方法(该方法返回值是T0类型,其参数是(T1,...,Tn)类型,在类<D,L2>中声明),虚拟机必须产生下列装载约束:(比如:C类实现D接口或者C继承D接口)

    T0Ll=T0L2,...,TnLl=TnL2

    如果虚拟机关于约束的内部列表包含两条约束:TLl=TL2 和TL2=TL3,这意味着TL1=TL3。就算在虚拟机实例执行中类型T从没有被L2装载过,L1和L3装载的名为T的类型是严格一致的。

    了解装载约束时如果不想看这么多数学用语,请参考本章8.12节的示例,该例子显示了,如果没有装载约束,一个黑客攻击者是如何突破Java虚拟机的类型安全保障的。

  • 相关阅读:
    DNS解析的并发性
    Pycharm(Jetbrains IDE)Debian buster Navigate Back/Forward (Ctrl+Alt+Left/Right)不好使的解决方法
    Linux命令行登录时的提示信息
    cmake编译Qt5
    cmake使用ccache
    bash 脚本所在文件夹
    gnome desktop
    gnome caps lock 和 num lock 键状态
    oracle 日期、月份处理
    独夜行
  • 原文地址:https://www.cnblogs.com/mongotea/p/11979613.html
Copyright © 2011-2022 走看看