Что это значит в трассировке стека? - PullRequest
11 голосов
/ 10 декабря 2008

Я вижу это в трассировке стека:

myorg.vignettemodules.customregistration.NewsCategoryVAPDAO.getEmailContentByID (I) Lmyorg / pushemail / модель / EmailContent;

Что означает "(I)L"?

Ответы [ 4 ]

20 голосов
/ 10 декабря 2008

Это форма искажения имени , используемая для устранения неоднозначности перегрузок метода. К имени метода добавляется ряд символов, описывающих параметры и тип возвращаемого значения: параметры отображаются последовательно в круглых скобках, а тип возвращаемого значения следует за закрывающей скобкой. Коды следующие:

  • Z: boolean
  • B: byte
  • C: char
  • S: short
  • I: int
  • J: long
  • F: float
  • D: double
  • L полное имя класса ;: полное имя класса
  • [ тип : массив тип
  • V: void

Итак, в вашем случае (I)Lmyorg/pushemail/model/EmailContent; означает, что метод принимает один аргумент типа int и возвращает объект типа myorg.pushemail.model.EmailContent.

16 голосов
/ 10 декабря 2008

Это означает, что метод принимает int и возвращает myorg.pushemail.model.EmailContent

Строка от "L" до ";" является дескриптором одного типа, для возвращаемого типа. В скобках указаны параметры метода (в данном случае это только один).

Эти дескрипторы типов определены как часть Спецификации виртуальной машины Java в разделе 4.3.2 . Таблица 4.3-A показывает все используемые коды. Когда класс компилируется, дескрипторы этой формы используются для указания сигнатуры методов и типов полей и переменных.

В сериализации Java дескрипторы методов являются частью информации, которая хэшируется в , образуя serialVersionUID по умолчанию для класса Serializable.

В RMI дескрипторы методов хэшируются, а результат используется для идентификации того, какой метод вызывается в удаленном интерфейсе.

0 голосов
/ 13 января 2016

В нем говорится, что в классе myorg.vignettemodules.customregistration.NewsCategoryVAPDAO нет метода с именем getEmailContentByID, который принимает int аргументы [обозначено (I)] и возвращает объект (объявленный L) с именем myorg/pushemail/model/EmailContent (закрытый с помощью ' ; ').

Символы L и I используются для обозначения имени класса и целого числа во внутренней спецификации класса Java.

0 голосов
/ 01 апреля 2010

Это второстепенный вопрос, но я не думаю, что это искажение имени. Искажение имени подразумевает добавление дополнительного имени к имени. ZBC и т. Д. - это то, как Java кодирует сигнатуры методов в файлах классов. Вместо того, чтобы писать логическое значение, они ставят Z. Это экономит место.

Согласно Википедии (применяется стандартная оговорка об ограничении ответственности), единственное искажение имени в java включает внутренние классы и JNI.

...