30

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

计算签名的规则是什么?

4

6 回答 6

43

它始终是一组括号,其中包含参数的类型指示符,一个接一个,没有逗号或任何东西,然后是结束括号后的返回值的类型指示符。这很简单。

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

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

如果您想根据反射从字面上计算Java 代码中的签名,那就很简单了;只需将上表与处理对象和数组的规则一起使用。

于 2011-11-09T14:12:56.057 回答
11

Just run javap -s <class-name> in the folder containing the .class files . It will tell you with 100% accuracy. No need to guess these things.

于 2013-12-01T22:42:09.870 回答
4

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

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        [ 
于 2011-11-09T14:16:32.603 回答
1

请参阅此处了解一些详细信息。

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

于 2011-11-09T14:16:51.747 回答
1

来自JLS,第 8.4.2 节

8.4.2 方法签名

方法的签名由方法的名称和方法的形式参数的数量和类型组成。一个类不能声明具有相同签名的两个方法,否则会发生编译时错误。

这个例子:

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.

所以“规则”是

方法的名称以及该方法的形式参数的数量和类型

于 2011-11-09T14:17:33.913 回答
1

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

于 2011-11-09T14:19:11.043 回答