`

描述符与特征签名的区别

    博客分类:
  • JVM
阅读更多
描述符与特征签名的区别


概念分析

在学习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;;


-以上-
2
0
分享到:
评论

相关推荐

    TeenyDT-USB描述符生成工具,支持命令行和图形化工具生成描述符和端点初始化代码,支持图形化工具生成驱动inf文件并签名

    《TeenyDT:USB描述符与驱动生成利器》 在USB设备开发中,USB描述符的编写是一项重要的工作,它定义了设备的各种属性,如设备类、子类、协议、接口、端点等。TeenyDT,全称为"TeenyDT USB描述符生成工具",是一款...

    SHOT:SHOT 3D描述符的C ++实现

    Di Stefano,“用于增强3D特征匹配的组合纹理形状描述符”,IEEE国际图像处理会议(ICIP),9月11日至14日,比利时布鲁塞尔,2011年。 S. Salti,F。Tombari,L。Di Stefano,“ SHOT:用于表面和纹理描述的直方图的...

    模式识别-手写签名识别系统

    2. 特征提取:特征提取是识别过程的核心,它将图像转换为一组定量描述符。常见的特征包括笔画的起点和终点、方向场、曲率、拐点、封闭区域等。这些特征应该具有区分性和稳定性,使得不同人的签名能被有效地区分,...

    MolSig:立体签名分子描述符-开源

    一种基于分子结构的立体化学计算分子图描述符的算法,该算法基于我们先前引入的签名分子描述符。 该算法可以生成两种类型的描述符,一种符合Cahn-Ingold-Prelog优先级规则,而一种基于我们之前对有向无环图的定义...

    用MATLAB编写的手写签名认证

    形状描述符如Hu矩、Zernike矩可以从几何角度描述签名的形状,而 texture analysis 如Gabor滤波器可以提取签名的纹理信息。 四、签名模板建立 将提取的特征组合成模板,用于后续的签名匹配。每个用户的签名会形成一...

    Win10系统解决强制数字签名认证问题三大解决办法.docx

    步骤与方法一中描述的进入UEFI固件设置类似。 **解决方法三:系统启动设置** 1. 进入“设置”&gt;“更新与安全”&gt;“恢复”&gt;“高级启动”&gt;“疑难解答”&gt;“高级选项”。 2. 在“高级选项”中,选择“启动设置”。 3. ...

    s60 v5 诺基亚 5530 xm 手机签名软件 免签名

    标题和描述提到的"诺基亚5530 XM手机签名软件",就是用于绕过这个限制的工具,它允许用户安装未经过官方签名的应用程序。这对于想要尝试非市场渠道获取的软件或者开发者的自签名应用来说非常有用。 在提供的压缩包...

    毕业设计MATLAB_用于签名验证的签名预处理.zip

    3. **特征提取**:可能涉及到边缘检测、形状描述符等方法,提取签名的独特特征以供后续验证使用。 4. **模式识别**:利用机器学习算法(如支持向量机、神经网络等)训练模型,以识别签名的有效性和真实性。 5. **...

    修改驱动程序签名为忽略

    2. 命令提示符:使用管理员权限打开命令提示符,运行`bcdedit /set nointegritychecks on`命令可以暂时禁用签名检查,但重启后会恢复。 3. Group Policy编辑器:通过组策略编辑器,可以永久禁用驱动程序签名检查。...

    USB CD-ROM数据包分析

    ConfigDescriptorBot包含了配置描述符和其他描述符,如接口描述符和端点描述符,用于定义设备的使用模式和功能。 3. **接口描述符**: 接口描述符定义了设备的接口,包括接口的数量、接口编号、交替设置、端点数量...

    stdole.dll文件签名证书过期

    在描述中提到的“NULL”可能是博主没有提供具体的细节,但通常情况下,当遇到这类问题,开发者或用户可能需要更新stdole.dll文件,或者找到有效的签名证书来重新签名文件,以确保其在系统中的正常运行。 标签“源码...

    无签名驱动加载工具

    描述虽然简洁,但我们可以推测这个工具可能是为了解决这个问题,允许用户在没有签名的情况下加载驱动程序。这通常是为了调试、开发或者在某些特定环境下运行未签名驱动的需求。 标签 "无签名" 强调了这个工具的核心...

    基于语义信息补偿全局特征的物体点云分类分割.docx

    传统点云处理方法主要通过手工设计几何形状描述符或签名描述符对特征进行提取,但手工设计的描述符效果较差,导致提取到的特征数量变少,进而影响最终的实验结果。 近年来,深度学习 3D 点云算法以处理数据量大等...

    toshookan:从 XML 描述符文件生成带有基本单元测试的 Java 域模型

    《基于XML描述符生成Java域模型与基础单元测试》 在IT行业中,高效地构建软件系统是关键。其中,Java作为一种广泛使用的编程语言,其强大的类库和工具为开发提供了便利。本文将深入探讨如何利用特定的XML描述符文件...

    Java方法签名的获取实例代码

    在获取方法签名时,我们需要将基本数据类型转换为对应的描述符,例如`boolean`类型对应的描述符为`Z`,`byte`类型对应的描述符为`B`,以此类推。 在Java中,方法签名的获取非常重要,因为它可以帮助开发者快速地...

    从虚拟机指令执行的角度分析JAVA中多态的实现原理.docx

    由于描述符包含了返回类型,两个方法即使简单名称和特征签名相同,只要描述符不同,就可以存在于同一个`.class`文件中。 4. **运行时多态(Override)**: 运行时多态是Java中多态的主要体现,它涉及到方法的动态...

Global site tag (gtag.js) - Google Analytics