Идентификаторы в угловых скобках на JVM, вызывающие внутреннюю ошибку метода
В следующем коде используется метод с именем <traitinit>
, но отклоняется JVM с VerifyError
:
class Foo
{
static void `<traitinit>`() // pseudocode identifier, not possible in Java
{
}
static void test()
{
`<traitinit>`() // call the <traitinit> method
}
}
Ошибка:
java.lang.VerifyError: Illegal call to internal method
Exception Details:
Location:
foo/bar/Foo.test()V @5: invokestatic
Reason:
Error exists in the bytecode
Поскольку JVM уже использует <init>
а также <clinit>
для конструкторов и инициализаторов классов это выглядит как разумное сообщение об ошибке. Тем не менее, есть ли какой-либо раздел в спецификации JVM, который четко определяет, что internal method
является? Я бы предположил, что он резервирует только два конкретных идентификатора сверху, но это не так.
1 ответ
Я сам нашел соответствующий раздел ( §4.2.2. Неквалифицированные имена) спецификации JVM:
4.2.2. Неквалифицированные имена
Имена методов, полей, локальных переменных и формальных параметров хранятся как неквалифицированные имена. Неквалифицированное имя должно содержать хотя бы одну кодовую точку Unicode и не должно содержать символов ASCII.; [ / (то есть точка или точка с запятой или левая квадратная скобка или косая черта).
Имена методов дополнительно ограничены, за исключением имен специальных методов
<init>
а также<clinit>
(§2.9), они не должны содержать символы ASCII <или> (то есть левую угловую скобку или правую угловую скобку).
(акцент мой)