Почему к моему пути Java добавляется буква "L"? - PullRequest
14 голосов
/ 02 октября 2009

В моем classpath загружен jar-файл (в iReport, если это имеет значение), и я уверен, что у меня есть нужный метод, когда я пытаюсь проверить соединение, поэтому при вызове jar я получаю java.lang.NoSuchMethodError, говоря это ссылка на класс

Lorg/springframework/web/context/WebApplicationContext

Я не уверен, связано ли это с проблемой или нет, но откуда взялась буква «L» в начале? В другой раз, когда я ссылался на класс, после класса была буква «V». Откуда приходят эти письма и что они значат?

Начало трассировки стека:

java.lang.NoSuchMethodError:  
org.springframework.web.context.ContextLoader
.getCurrentWebApplicationContext()Lorg/springframework/web/context/WebApplicationContext;

Ответы [ 2 ]

24 голосов
/ 02 октября 2009

Эти буквы используются Java для внутреннего кодирования сигнатуры метода. Например, буква «L» объявляет следующий «объект», который указывается полным именем класса, за которым следует точка с запятой. Буква «V» должна начинаться с круглых скобок и описывает тип возврата «void».

Возьмите свой пример:

java.lang.NoSuchMethodError:
org.springframework.web.context.ContextLoader .getCurrentWebApplicationContext () Lorg / springframework / веб / контекст / WebApplicationContext;

В нем говорится, что в классе org.springframework.web.context.ContextLoader нет метода с именем getCurrentWebApplicationContext, который не принимает аргументов [обозначен ()] и возвращает объект (объявленный L) с именем `org / springframework / web / context / WebApplicationContext (закрыто ';').

РЕДАКТИРОВАТЬ: Список всех кодов в таблице 3.2 спецификации JNI .

EDIT2: Еще более авторитетно: раздел 4.3 Дескрипторы спецификации JVM содержат полную ссылку на формат и коды.

8 голосов
/ 02 октября 2009

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

Подробнее см. Java VM .

И таблица типов полей:

BaseType
B     byte (signed byte)
C     char (Unicode character)
D     double (double-precision floating-point value)
F     float (single-precision floating-point value)
I     int (integer)
J     long (long integer)
L<classname>;     reference (an instance of class <classname>)
S     short (signed short)
Z     boolean (true or false)
[     reference (one array dimension )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...