Что это означает в трассировке стека?

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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

  • Z: boolean
  • B: byte
  • C: char
  • S: short
  • I: int
  • J: long
  • F: float
  • D: double
  • L full-qual-class-name ;: полный класс
  • [ Тип: массив типа
  • V: void

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

Ответ 3

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

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

Ответ 4

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

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