前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中的方法签名解读

Java中的方法签名解读

作者头像
明明如月学长
发布2021-08-31 15:14:33
2.6K0
发布2021-08-31 15:14:33
举报
文章被收录于专栏:明明如月的技术专栏

一、背景

Java的函数签名是基础知识,也是面试中常问的知识点之一,虽然难度不大,但是很多人并没有关注过或者查过这个问题。

二、解释

根据维基百科的定义: https://en.wikipedia.org/wiki/Type_signature

2.1 类型签名

在虚拟机中,内部类型签名在字节码层面用来识别函数或者类。

例如:String String.substring(int, int) 其字节码表示形式为:Ljava/lang/String.substring(II)Ljava/lang/String;

main()方法长这样:

代码语言:javascript
复制
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中,函数签名包括函数名,参数的数量、类型和顺序。

返回值和函数上声明的异常并不属于函数签名的构成部分。

下两个函数签名不同

代码语言:javascript
复制
doSomething(String[] y);
doSomething(String y);

因为他们虽然函数名相同,但是参数类型不同。

代码语言:javascript
复制
下面三个函数的签名相同:
代码语言:javascript
复制
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

代码语言:javascript
复制
/*
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);
  }


}

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/05/13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
  • 二、解释
    • 2.1 类型签名
    • 2.2 Java中的函数签名
      • 2.3 获取函数签名的工具类
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档