Jvm虚拟机依靠两个字符串唯一识别方法或者成员变量:“名称”以及“签名”。分别介绍如下,重点说明根据声明写出签名的方法,即第二部分。
1. 名称
如果是函数,那么名称就是函数名称。如果是成员变量,那么名称就是成员变量名称。例如:
public boolean isDisplayable();
名称即为”isDisplayable”
ClassType m_obj;
名称即为”m_obj”
2. 签名
因为java语言允许重载,即多个函数同名,所以不能仅仅依靠名称来区分函数。为了准确区分重载的多个java方法,需要判断各个方法的签名。
函数的签名由两部分组成,形式为“(参数签名)返回值签名”。例如:public boolean isDisplayable();的签名为“()Z”。
成员变量的签名只有一部分,形式为“类型签名”。例如:ClassType m_obj;的签名为”Lpackage1/package2/ClassType;”
签名与类型一一对应的,对应表如下:
boolean Z
byte B
char C
short S
int I
long J
float F
double D
package1.package2.ClassName Lpackage1/package2/ClassName; //以大写字母’L’开头、以字符’;’结尾。
Type[] [Type_des //一维数组则只有一个’[‘
Type[][] [[Type_des //二维数组则有两个’[‘
3. 例子
package com.sumavision;
public class TestClass{
boolean boolVal; //boolVal的签名为:Z
byte byteVal; //byteVal的签名为:B
char cVal; //cVal的签名为:C
short sVal; //sVal的签名为:S
int iVal; //iVal的签名为:I
long lVal; //lVal的签名为:J
float fVal; //fVal的签名为:F
double dVal; //dVal的签名为:D
String strVal; //strVal的签名为:Ljava/lang/String;
String[] strArr; //strArr的签名为:[Ljava/lang/String;
String[][] obj; //obj的签名为:[[Ljava/lang/String;
public String getStrVal(TestClass obj); //此函数的签名为:(Lcom/sumavision/TestClass;)Ljava/lang/String;
public String[] getStrArrayVal(TestClass[] objArray, int pos); //此函数的签名为:([Lcom/sumavision/TestClass;I)[Ljava/lang/String;
public String[] getStrArrayVal(TestClass[] objArray, int pos, int verbose); //此函数的签名为:([Lcom/sumavsion/TestClass;II)[Ljava/lang/String;
};
4. 可以利用jdk提供的编译器获得指定类中所有变量和方法的签名。方法为:
1)打开命令行窗口
2)利用cd命令进入包所在目录
3)执行javap –s –p 类全限定名称(package1.package2.classname样式)
执行上述3步后,命令行窗口就会输出指定类的所有变量和方法的签名。
结果实例如下:
class test.Thread.TestTh extends java.lang.Thread{
test.Thread.TestTh();
Signature: ()V
public void run();
Signature: ()V
}