Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java中的方法签名解读

Java中的方法签名解读

作者头像
明明如月学长
发布于 2021-08-31 07:14:33
发布于 2021-08-31 07:14:33
2.8K00
代码可运行
举报
运行总次数:0
代码可运行

一、背景

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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
doSomething(String[] y);
doSomething(String y);

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
下面三个函数的签名相同:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
/*
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java反射(超详细!)[通俗易懂]
通过java语言中的反射机制可以操作字节码文件(可以读和修改字节码文件。) 通过反射机制可以操作代码片段。(class文件。)
全栈程序员站长
2022/09/02
4710
Spring杂谈 | 从桥接方法到JVM方法调用
这些代码对我之前也造成了不小疑惑,在彻底弄懂后通过本文分享出来,也能减少大家在阅读代码过程中的障碍!
程序员DMZ
2020/07/06
1.7K0
深入理解 Java 反射:Method (成员方法)
深入理解 Java 反射系列: 深入理解 Java 反射:Class (反射的入口) 深入理解 Java 反射:Field (成员变量) 深入理解 Java 反射:Method (成员方法) Met
张拭心 shixinzhang
2018/01/08
2.6K0
猿思考系列5——一文明白java和微商那点儿事儿
看完上一个章节,相信你已经掌握了一些编写并发代码编写的要领了。今天我们来聊一个新的话题。另外真的很感谢大家的支持,和巨兽的斗争暂时进入僵持阶段,猿人工厂君已经说了,虽千万人,吾往矣。中间细节,猿人工厂君,会在方便的时候公开,程序猿鸭,且行且珍惜。
山旮旯的胖子
2020/07/28
2670
猿思考系列5——一文明白java和微商那点儿事儿
【qdox】Java 代码解析利器 QDox
最近在写 maven 插件,涉及到了 java 代码解析这块内容。需要解析 java 源码,然后对于类中的不同部分进行处理。发现手写还是很难的,找了一圈发现了两个不错的工具可以使用,一个是 javaparser[1],另一个是 qdox[2] 。个人感觉 javaparser 强大一些,更新与维护也比较勤,但是相对来说上手难一点,从他的使用文档独立成书在买,可见一斑,而 qdox 比较小巧,上手很快,功能也满足大部分需求,最终还是选择了 qdox。
KIWI
2020/04/08
1.5K0
Java桥方法
Java桥方法的出现是由于Java中泛型在虚拟机中会类型擦除,为了解决因擦除引起在多态时会引起问题而引入桥方法这个概念
doper
2022/09/26
3790
Java桥方法
Dubbo源码篇02---从泛化调用探究Wrapper机制的原理
对于传统的三层架构而言,Controller层负责接收请求,Service层负责处理与业务逻辑相关的请求,Dao层负责与数据库进行交互,配合Model模型对象承载业务数据,在请求上下文中传递,最终处理填充完毕数据后,交由View视图进行渲染:
大忽悠爱学习
2023/05/09
8050
Dubbo源码篇02---从泛化调用探究Wrapper机制的原理
Java之反射机制详解「建议收藏」
通过java语言中的反射机制可以操作字节码文件。有点类似于黑客(可以读和修改字节码文件。)通过反射机制可以操作代码片段。(class文件)让程序更加灵活。
全栈程序员站长
2022/09/08
5130
java:axis2环境下获取方法参数名的另一种方法
想获取”param1”,和”param2”这个参数名,肯定是不行的。关于获取方法的参数名字(不是参数类型),一般的做法是借助第三方包javassist或asm来实现。参见下面的文章:
10km
2022/05/07
2430
反射入门_入门教程
类(外部类,内部类,匿名内部类等等),接口,数组,enum,注解,基本数据类型 ,void都算Class对象
全栈程序员站长
2022/09/21
2620
Java 类之 java.lang.reflect.Method
java.lang.reflect.Method 类是 Java 反射机制中的一部分,用于表示类的方法。反射是一种在运行时检查或修改类的行为的能力。Method 类提供了对类的方法的信息的访问和操作。
訾博ZiBo
2025/01/06
1290
Java复习3-类的继承
本次学习面向对象设计的另外一个基本概念:继承(inheritance)。这是Java程序设计中的一项核心技术。另外,还要学习反射(reflection)的概念。
Ryan-Miao
2018/08/01
6910
为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】
Spring MVC和MyBatis作为当下最为流行的两个框架,大家平时开发中都在用。如果你往深了一步去思考,你应该会有这样的疑问:
YourBatman
2019/09/03
1.3K0
为何Spring MVC可获取到方法参数名,而MyBatis却不行?【享学Spring MVC】
Java 高级开发必修知识---反射
程序猿们经常说的一句话:反射反射。。。程序员的快乐 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能够调用它的任意一个方法和属性; 这种动态获取的信息
房上的猫
2018/04/16
8740
Java 高级开发必修知识---反射
字节码编程,Javassist篇四《通过字节码插桩监控方法采集运行时入参出参和异常信息》
字节码编程插桩这种技术常与 Javaagent 技术结合用在系统的非入侵监控中,这样就可以替代在方法中进行硬编码操作。比如,你需要监控一个方法,包括;方法信息、执行耗时、出入参数、执行链路以及异常等。那么就非常适合使用这样的技术手段进行处理。
小傅哥
2020/04/28
1.3K1
字节码编程,Javassist篇四《通过字节码插桩监控方法采集运行时入参出参和异常信息》
反射反射 程序员的快乐
java反射操作其实就是主要围绕Class,Field,Methon,Constructor等几个类来操作其中的方法
房上的猫
2018/04/11
9540
反射反射 程序员的快乐
Java ”框架 = 注解 + 反射 + 设计模式“ 之 反射详解
Reflection (反射)是被视为 **动态语言的关键** ,反射机制允许程序在执行期借助 **Reflection API** 取得任何类的内部信息,并能直接操作任意对象内部属性以及方法。
RainbowSea
2023/02/23
6990
日志打印组件踩了Java反射的坑,真是一步一个脚印呢
原因已经搞清了: clazz.getMethod获取的方法没有使用public修饰符时,则会引发NoSuchMethodException异常。 解决办法: 方法1:ready方法增加public修饰符。这样clazz.getMethod就可以找到了
烟雨平生
2023/09/05
3030
日志打印组件踩了Java反射的坑,真是一步一个脚印呢
Java编程思想重点笔记(Java开发必看)
Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理解题(比如is-a关系和has-a关系的区别),也有深入的涉及RTTI和JVM底层反编译知识。
Java团长
2018/07/23
7670
Java编程思想重点笔记(Java开发必看)
Javassist | 字节码增强技术
Javassist 是一个开源的分析、编辑和创建Java字节码的类库. 其主要优点在于简单快速. 直接使用 java 编码的形式, 而不需要了解虚拟机指令, 就能动态改变类的结构, 或者动态生成类.
一个架构师
2022/06/27
1.1K0
相关推荐
Java反射(超详细!)[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验