JVM上尖括号中的标识符导致内部方法错误

时间:2016-03-23 20:04:49

标签: java jvm identifier jls verifyerror

以下代码使用名为<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是什么的部分?我猜想它只保留了上面的两个特定标识符,但似乎并非如此。

1 个答案:

答案 0 :(得分:2)

我自己找到了JVM规范的相关部分(§4.2.2. Unqualified Names):

  

4.2.2。不合格的名称

     

方法,字段,局部变量和形式参数的名称存储为非限定名称。非限定名称必须至少包含一个Unicode代码点,并且不得包含任何ASCII字符。 ; [/(即句号或分号或左方括号或正斜杠)。

     

方法名称受到进一步约束,因此除了特殊方法名称<init><clinit>(§2.9)之外,它们不得包含ASCII字符&lt;或&gt; (即左尖括号或右尖括号)。

(强调我的)