描述符与特征签名的区别
概念分析
在学习Java语言和JVM时,可能对字段(方法)的描述符(Descriptor)以及字段(方法)的特征签名(Signatures)这两个概念没有区别清楚。其中描述符是JVM中定义class文件字节码的概念,而特征签名在Java语言层面和java虚拟机层面都有定义,两者的定义并不相同。
1.字段(方法)的描述符
描述符java虚拟机层面的概念,是针对class文件字节码定义的。定义如下:
引用
A field descriptor represents the type of a class, instance, or local variable. It is a series of characters generated by the grammar:
A method descriptor represents the parameters that the method takes and the value that it returns:
注:
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.2
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.3
需要注意的两点如下:
- 描述符概念是针对class字节码的;
- 方法描述符中包括方法的返回值类型。
2.字段(方法)的特征签名
对于特征签名这个概念,Java语言规范和Java虚拟机规范中存在不同的定义
2.1 Java语言层面
Java方法的特征签名只包括了方法的名称、参数顺序以及参数类型,Java语言规范中的定义参考如下:
引用
Two methods have the same signature if they have the same name and argument types.
注:
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.2
2.2.Java虚拟层面
Java虚拟机中定义的是针对字节码的,方法的特征签名包括方法的返回值以及可能抛出的受检查异常(Checked Exceptions),也就是方法描述时在throws关键字后面列举的异常。Java虚拟机规范中定义如下:
引用
A method signature, defined by the production MethodTypeSignature, encodes the (possibly parameterized) types of the method's formal arguments and of the exceptions it has declared in its throws clause, its (possibly parameterized) return type, and any formal type parameters in the method declaration.
注:
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.4
在Java语言层面,描述符与特征签名不同;在Java虚拟机规范中,描述符与特征签名是相同的。
方法重载(Overload)
对于一句话的理解:
引用
在同一class文件中,两个方法可以拥有同样的特征签名,前提是返回值不能相同。
首先说这句话表述是不准确的,特征签名这个概念到底是Java语言层面的还是JVM层面的没有交代清楚。如果是JVM层面的,由于特征签名已经包括了方法的返回值类型,后面又说返回值不同,这不是自相矛盾吗?
有一个如下的例子:
public class cls {
public static int mytest(List<String> s){return 0;}
public static String mytest(List<Integer> ss) {return "";}
}
这两个方法,的特征签名(语言层面)是不同的,所以可以编译(JDK6u5)通过,但是由于Java泛型是一种语法糖行为,编译后(Javac)类型将被擦除。字节码如下:
public static int mytest(java.util.List);
Code:
Stack=1, Locals=1, Args_size=1
0: iconst_0
1: ireturn
LocalVariableTable:
Start Length Slot Name Signature
0 2 0 s Ljava/util/List;
LocalVariableTypeTable: length = 0xC
00 01 00 00 00 02 00 11 00 14 00 00
Signature: length = 0x2
00 16
public static java.lang.String mytest(java.util.List);
Code:
Stack=1, Locals=1, Args_size=1
0: ldc #2; //String
2: areturn
LocalVariableTable:
Start Length Slot Name Signature
0 3 0 ss Ljava/util/List;
LocalVariableTypeTable: length = 0xC
00 01 00 00 00 03 00 18 00 19 00 00
Signature: length = 0x2
00 1A
}
由此,可以知道这两个方法的特征签名(语言)变成相同的了,但是他们的返回类型不同,所以在Class文件中可以共存,开头说的那句话其实就是表述这个意思,只是概念上使用会让人产生疑惑。
在JDK7中,javac的行为和ejc的一致了,这段代码将不能编译通过。
Code属性的LocalVariableTable属性
JDK5引入泛型后,LocalVariableTable属性增加了一个LocalVariableTypeTable属性,两者的不同主要是将描述符替换成了特征签名(语言)。由于泛型在编译后类型将被擦除,描述符将无法准确的描述泛型类型了,而特征签名(语言)记录的是Java语言层面的类型,即未被擦除时的类型。参考代码如下:
public static String mytest(List<Integer> ss) {return "";}
public static String mytest(int ss) {return "";}
public static java.lang.String mytest(java.util.List);
Code:
Stack=1, Locals=1, Args_size=1
0: ldc #2; //String
2: areturn
LocalVariableTable:
Start Length Slot Name Signature
0 3 0 ss Ljava/util/List;
LocalVariableTypeTable: length = 0xC
00 01 00 00 00 03 00 18 00 19 00 00
Signature: length = 0x2
00 1A
public static java.lang.String mytest(int);
Code:
Stack=1, Locals=1, Args_size=1
0: ldc #2; //String
2: areturn
LocalVariableTable:
Start Length Slot Name Signature
0 3 0 ss I
}
在第一个方法中,存在泛型参数,在LocalVariableTypeTable属性中,其特征签名(语言)值为00 1A(26)
该索引常量池中值如下:
const #26 = Asciz (Ljava/util/List<Ljava/lang/Integer;>;)Ljava/lang/String;;
-以上-
分享到:
相关推荐
TeenyDT_USB描述符生成工具,支持命令行和图形化工具生成描述符和端点初始化代码,支持图形化工具生成驱动inf文件并签名
由于这些应用特定的挑战,该贡献对局部形状描述符(即点特征直方图(PFH),快点特征直方图(FPFH),方向直方图的签名(SHOT),旋转度)的性能进行了实验评估将3D点分类到不同类型的植物器官中的投影统计(RoPS)...
Di Stefano,“用于增强3D特征匹配的组合纹理形状描述符”,IEEE国际图像处理会议(ICIP),9月11日至14日,比利时布鲁塞尔,2011年。 S. Salti,F。Tombari,L。Di Stefano,“ SHOT:用于表面和纹理描述的直方图的...
用描述符来描述方法时,先按照参数列表, 后返回值的顺序描述 ,参数列表按照参数的严格顺序放在一组小括号内 从上面的描述符定义看,方法的描述符是包含了方法的返回值的。因此, 简单名称相同、特征签名也相同、...
提出了一种有效的形状签名,即多层夹角函数(MIAF),以描述从全局信息到形状的局部变化的层次信息。... MIAFD与其他形状描述方法的比较还表明,所提出的描述符在相同的召回值下具有最高的精度,从而验证了其有效性。
一种基于分子结构的立体化学计算分子图描述符的算法,该算法基于我们先前引入的签名分子描述符。 该算法可以生成两种类型的描述符,一种符合Cahn-Ingold-Prelog优先级规则,而一种基于我们之前对有向无环图的定义...
2019论文中描述的用于3D表面形状匹配的Local Point Signature的MATLAB实现: 王一群,郭建伟,严东明,王凯,张晓鹏。 如果此代码/程序(或其部分)对您的项目有利,请考虑引用以上文章。 用法 请使用MATLAB运行“ ...
csd_lmnn是一个软件包,用于使用众所周知的点描述符(例如,热核签名和波核签名和度量学习),特别是大余量最近邻居算法,学习3D非刚性形状的最佳形状描述符。 它可用于形状分类,形状相似性排名和形状检索。 此存储...
FullyNoded:自主权,安全,功能强大,易于使用的钱包,利用您自己的节点作为后端。 由PSBT和描述符提供支持。 充当脱机签名者,将您的节点用作仅监视的钱包。 C-Lightning兼容,可即时,不公平地廉价付款
限制应用程序描述符文件中的目标配置文件 不同配置文件的功能 第 15 章: AIRSWF 浏览器内 API 自定义无缝安装 badgeswf 使用 badgeswf 文件安装 AIR 应用程序 加载 airswf 文件 检查是否已安装运行时 从网页...
《Java虚拟机规范(Java SE 7版)》是Java领域最重要和最...第4章深入分析了用来表示编译后的类和接口的class文件格式,主要包括ClassFile结构、描述符与签名、常量池、字段、方法、属性、代码约束与class文件校验等。
第4章深入分析了用来表示编译后的类和接口的class文件格式,主要包括ClassFile结构、描述符与签名、常量池、字段、方法、属性、代码约束与class文件校验等。第5章定义了Java虚拟机启动以及类和接口的加载、链接和...
第4章深入分析了用来表示编译后的类和接口的class文件格式,主要包括ClassFile结构、描述符与签名、常量池、字段、方法、属性、代码约束与class文件校验等。第5章定义了Java虚拟机启动以及类和接口的加载、链接和...
Au3 本地安全管理|审核UDF ...9, *备份及导入“安全描述符”。 10,*截取程序异常,并恢复程序运行。 11,*调用DPAPI加解密数据。 12,*自定义次数的进程实例。 13,*模拟进程文件路径。 14,还有很多,非常多。
me-tools, 使用英特尔我的工具 me_unpack.py这里脚本允许你转储和提取 Intel fimrware图像。 支持的格式:带有描述符的完整 SPI Flash 图像( 签名 5A A5 0 )完整的区域图像( 签名'$fpt )单独的代码分区和更新映像
邮票规格v1.6 介绍 存在此规范是为了定义可组合工厂功能(称为Stamps )的标准格式...标记是可组合的工厂函数,它根据其描述符返回对象实例。 stamp ( options ?: Object , ... args ?: [ ... Any ] ) => instance: ob
首先,在技术上,我们提出了一种新的描述符,称为聚合签名,基于显着性,能够表示小物体的高度显着特征。第二,理论上,我们证明了所提出的签名更准确地匹配前景物体,具有较高的概率。第三,在实验中,聚合签名在多...
因此,我们的方法可以捕获形状的不同频率处的几何特征,这些特征满足理想描述符的性质。 我们在标准基准上进行形状检索实验,并与另一种基于热核的方法进行了比较。 实验结果表明,该方法是有效且准确的。
仅依靠支持着色器中纹理的无边界数组的硬件,可以大大降低资源绑定模型的复杂性,从而减少代码的复杂度,减少根签名和描述符堆的数量。 一个GPU(CB,SR,UA)描述符堆和几个根签名足以覆盖任何渲染方案。 渲染过程...