Идентификаторы в угловых скобках на 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 <или> (то есть левую угловую скобку или правую угловую скобку).

(акцент мой)

Другие вопросы по тегам