Что означает "() V" в сигнатуре класса? - PullRequest
18 голосов
/ 28 марта 2012

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

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

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

c.getSignature();

Я получаю

public Echo ()V

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

Ответы [ 3 ]

45 голосов
/ 28 марта 2012

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

Для вашего примера:

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

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

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

Например:

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

станет

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

См. спецификацию на веб-сайте Sun ^ H ^ H ^ HOracle

5 голосов
/ 28 марта 2012

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

3 голосов
/ 28 марта 2012

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

...