一、背景

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);
  }


}

从其中获取函数签名的方法也可以得到印证

如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

 

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐