"()V"在班级签名中的含义是什么?

Evi*_*ils 19 java bytecode javassist

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

CtConstructor c = CtNewConstructor.make ( argTypes, null, newClass );
Run Code Online (Sandbox Code Playgroud)

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

c.getSignature();
Run Code Online (Sandbox Code Playgroud)

我明白了

public Echo ()V
Run Code Online (Sandbox Code Playgroud)

我很困惑"V"是什么意思?我期待公共Echo(); 或类似的东西......

Sim*_*son 48

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

对于你的例子:

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

该计划的其他部分是:

  • B - 字节
  • C - char
  • D - 双倍
  • F - 漂浮
  • I - int
  • J - 长
  • S - 简短
  • V - 无效
  • Z - 布尔值
  • [ - 括号后面的数组
  • L[类名] ;- 此类的实例,点为斜线
  • ([args] )[返回类型] - 方法签名

例如:

public int foo(String bar, long[][] baz)
Run Code Online (Sandbox Code Playgroud)

会成为

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

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

  • 这是一个蹩脚的笑话尝试.见http://en.wikipedia.org/wiki/Backspace#.5EH (12认同)

Phi*_*ger 6

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


Eug*_*hov 5

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