Java中的方法签名解读
一、背景Java的函数签名是基础知识,也是面试中常问的知识点之一,虽然难度不大,但是很多人并没有关注过或者查过这个问题。二、解释根据维基百科的定义:https://en.wikipedia.org/wiki/Type_signature2.1 类型签名在虚拟机中,内部类型签名在字节码层面用来识别函数或者类。例如:StringString.substring(int...
一、背景
Java的函数签名是基础知识,也是面试中常问的知识点之一,虽然难度不大,但是很多人并没有关注过或者查过这个问题。
二、解释
根据维基百科的定义: https://en.wikipedia.org/wiki/Type_signature
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 获取函数签名的工具类
参考:http://www.java2s.com/Code/Java/Reflection/Methodsignature.htm
/*
Copyright 2011 Karl-Michael Schneider
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
//package org.jwatter.util;
import java.lang.reflect.Method;
public class ReflectUtil
{
public static String parametersAsString ( Method method )
{
return parametersAsString(method, false);
}
public static String getSignature ( Method method, boolean longTypeNames )
{
return method.getName() + "("
+ parametersAsString(method, longTypeNames) + ")";
}
public static String parametersAsString ( Method method,
boolean longTypeNames )
{
Class<?>[] parameterTypes = method.getParameterTypes();
if ( parameterTypes.length == 0 ) return "";
StringBuilder paramString = new StringBuilder();
paramString.append(longTypeNames ? parameterTypes[0].getName()
: parameterTypes[0].getSimpleName());
for ( int i = 1 ; i < parameterTypes.length ; i++ )
{
paramString.append(",").append(
longTypeNames ? parameterTypes[i].getName()
: parameterTypes[i].getSimpleName());
}
return paramString.toString();
}
public static String getSignature ( Method method )
{
return getSignature(method, false);
}
}
从其中获取函数签名的方法也可以得到印证
如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。
更多推荐
所有评论(0)