计算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虚拟机规范中找到此信息