26

我用 Javassist 创建了一个没有真正方法的构造函数

CtConstructor c = CtNewConstructor.make ( argTypes, null, newClass );

当我试图发出这个类的签名时

c.getSignature();

我明白了

public Echo ()V

我很困惑“V”是什么意思?我期望要么 public Echo (); 或类似的东西...

4

3 回答 3

56

JVM 使用一种紧凑的方式来存储方法签名,其中构造函数被认为是一种特殊情况。

对于您的示例:

  • ()表示不带参数的方法
  • V表示它什么也不返回

该计划的其他部分是:

  • B- 字节
  • C- 字符
  • D- 双倍的
  • F- 漂浮
  • I- 整数
  • J- 长
  • S- 短的
  • V- 空白
  • Z- 布尔值
  • [- 括号后面的东西的数组
  • L[类名] ;- 这个类的实例,点变成斜线
  • ([args] )[返回类型] - 方法签名

例如:

public int foo(String bar, long[][] baz)

会成为

(Ljava/lang/String;[[J)I

请参阅Sun^H^H^HOracle 网站上的规范

于 2012-03-28T14:14:15.330 回答
7

“V”确定结果类型“void”

于 2012-03-28T14:10:26.890 回答
5

类型签名中的 V 表示 void 类型。字节码不区分构造函数和其他方法(除了使用特殊的方法名)。

于 2012-03-28T14:10:00.707 回答