以下代码使用名为<traitinit>
的方法,但被VerifyError
的JVM拒绝:
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
是什么的部分?我猜想它只保留了上面的两个特定标识符,但似乎并非如此。
答案 0 :(得分:2)
我自己找到了JVM规范的相关部分(§4.2.2. Unqualified Names):
4.2.2。不合格的名称
方法,字段,局部变量和形式参数的名称存储为非限定名称。非限定名称必须至少包含一个Unicode代码点,并且不得包含任何ASCII字符。 ; [/(即句号或分号或左方括号或正斜杠)。
方法名称受到进一步约束,因此除了特殊方法名称
<init>
和<clinit>
(§2.9)之外,它们不得包含ASCII字符&lt;或&gt; (即左尖括号或右尖括号)。
(强调我的)