计算Java函数的签名

有没有办法计算 Java类的方法的签名? 一个签名
like ([Ljava/lang/String;)V表示一个以String[]为参数的函数
并返回void

计算签名的规则是什么?

它始终是一组括号,用于包含参数的类型表示符,一个接一个地没有逗号或任何内容,后面是关闭paren之后返回值的类型指示符。 这很简单。

此页面上有一个类型签名表:

 Signature Java Type Z boolean B byte C char S short I int J long F float D double V void L fully-qualified-class ; fully-qualified-class [ type type[] 

最后两个意味着命名一个类,你说,例如, Ljava/lang/Object; ,并且为了命名一个(例如) int的数组,你说[I和一个int数组的数组是[[I

如果你想在基于reflection的Java代码中逐字计算签名,它就足够简单了; 只需使用上表中的规则来处理对象和数组。

只需在包含.class文件的文件夹中运行javap -s 。 它会100%准确地告诉你。 无需猜测这些事情。

快速谷歌搜索发现了这个网页:

http://www.rgagnon.com/javadetails/java-0286.html

签名分为两部分。 第一部分包含在括号内,表示方法的参数。 第二部分在右括号后面,表示返回类型。 Java类型和C类型之间的映射是

 Type Chararacter boolean Z byte B char C double D float F int I long J object L short S void V array [ 

请看这里了解一些细节。

基本上它是params,然后返回值。

来自JLS,§8.4.2 :

8.4.2方法签名

方法的签名包括方法的名称以及方法的forms参数的数量和类型。 类可能不会声明具有相同签名的两个方法,或者发生编译时错误。

这个例子:

 class Point implements Move { int x, y; abstract void move(int dx, int dy); void move(int dx, int dy) { x += dx; y += dy; } } 

导致编译时错误,因为它声明了两个具有相同签名的move方法。 即使其中一个声明是abstract这也是一个错误。

所以“规则”是

方法的名称以及方法的forms参数数量和类型

您可以在Java虚拟机规范中找到此信息