Что означает "() V" в подписи класса?

Я создал конструктор с Javassist, у которого нет реального метода

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

Когда я пытаюсь пометить подпись этого класса

c.getSignature();

Я получаю

public Echo ()V

Я смущен, что означает "V"? Я ожидал либо публичного Echo(); или что-то подобное...

Ответы

Ответ 1

JVM использует компактный способ хранения сигнатур методов, из которых конструкторы считаются частным случаем.

В вашем примере:

  • () указывает метод, не содержащий аргументов
  • V указывает, что он ничего не возвращает

Другие части схемы:

  • B - байт
  • C - char
  • D - double
  • F - float
  • I - int
  • J - long
  • S - короткий
  • V - void
  • Z - boolean
  • [ - массив вещи, следующей за скобкой
  • L [имя класса] ; - экземпляр этого класса, с точками, становящимися косыми чертами
  • ( [args] ) [тип возврата] - подпись метода

Например:

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

станет

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

Смотрите spec на веб-сайте Sun ^ H ^ H ^ HOracle

Ответ 2

V в сигнатуре типа означает тип void. Bytecode не отличает конструкторы от других методов (кроме использования специального имени метода).

Ответ 3

"V" определяет тип результата "void"