1、定义
*中,对类型签名的解释如下:
In computer science, a type signature or type annotation defines the inputs and outputs for a function, subroutine or method. A type signature includes the number, types and order of the arguments contained by a function. A type signature is typically used during overload resolution for choosing the correct definition of a function to be called among many overloaded forms.
大概意思就是:在计算机科学中,类型签名或类型注释定义了函数、子程序或方法的输入和输出。类型签名包括函数所包含的参数的数目、类型和顺序。通常在重载解析期间使用类型签名来选择要在多个重载表单中调用的函数的正确定义。
许多编程语言使用名称改变来将更多的语义信息从编译器传递给链接器。除了mangling之外,函数签名(存储在大多数编译器的内部)中还有过多的信息,这些信息不是很容易获得,但是可以访问。
理解函数签名的概念是所有计算机科学研究的一个重要概念。
计算机科学理论,特别是多态性的概念,充分利用了函数签名的概念。
2、Java中的类型签名
2.1 内部类型签名
在虚拟机中,内部类型签名在字节码层面用来识别函数或者类。
例如:String String.substring(int, int) 其字节码表示形式为:Ljava/lang/String.substring(II)Ljava/lang/String;
main()方法:
public static void main(String[] args)
字节码表示形式为:Lsome/package/Main/main:([Ljava/lang/String;)V
main()方法包括3个部分
-
public
表示main()
方法可以被任意对象调用 -
static
表示main()
是一个类方法 -
void
表示main()
该方法无返回值
2.2 Java中的函数签名
在Java中,函数签名包括函数名,参数的数量、类型和顺序。返回值和函数上声明的异常并不属于函数签名的构成部分。
下两个函数签名不同
doSomething(String[] y); doSomething(String y);
因为他们虽然函数名相同,但是参数类型不同。
下面三个函数的签名相同:
int doSomething(int y) String doSomething(int x) int doSomething(int z) throws java.lang.Exception
他们的函数名相同,参数数量,类型和顺序也一致。
2.3 获取函数签名的工具类
1 /* 2 Copyright 2011 Karl-Michael Schneider 3 Licensed under the Apache License, Version 2.0 (the "License"); 4 you may not use this file except in compliance with the License. 5 You may obtain a copy of the License at 6 http://www.apache.org/licenses/LICENSE-2.0 7 Unless required by applicable law or agreed to in writing, software 8 distributed under the License is distributed on an "AS IS" BASIS, 9 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 10 See the License for the specific language governing permissions and 11 limitations under the License. 12 */ 13 //package org.jwatter.util; 14 15 import java.lang.reflect.Method; 16 17 public class ReflectUtil { 18 public static String parametersAsString(Method method) { 19 return parametersAsString(method, false); 20 } 21 22 public static String getSignature(Method method, boolean longTypeNames) { 23 return method.getName() + "(" 24 + parametersAsString(method, longTypeNames) + ")"; 25 } 26 27 public static String parametersAsString(Method method, 28 boolean longTypeNames) { 29 Class<?>[] parameterTypes = method.getParameterTypes(); 30 if (parameterTypes.length == 0) return ""; 31 StringBuilder paramString = new StringBuilder(); 32 paramString.append(longTypeNames ? parameterTypes[0].getName() 33 : parameterTypes[0].getSimpleName()); 34 for (int i = 1; i < parameterTypes.length; i++) { 35 paramString.append(",").append( 36 longTypeNames ? parameterTypes[i].getName() 37 : parameterTypes[i].getSimpleName()); 38 } 39 return paramString.toString(); 40 } 41 42 public static String getSignature(Method method) { 43 return getSignature(method, false); 44 } 45 46 }
从其中获取函数签名的方法也可以得到印证