2

JVM如何创建和识别匿名内部类?

例如,我可以为同一个接口创建多个匿名内部类,每个内部类都有自己独特的实现。而且这些都可以在同一个(显式)类中,因此它所在的类不能是整个标识符。那么 JVM 使用什么信息来确定一个匿名对象和另一个匿名对象呢?(我唯一能想到的是声明它的行号,但这似乎有点太人性化,不能成为真正的答案。)

有没有办法查看.class编译器为这些文件生成的文件?或者它们是在运行时动态创建的?

4

2 回答 2

3

Java代码:

   public static void main(String...args) {
    TestInter t = null; 
            t = new TestInter() { //com/next/b/Test$1 
            };
            t= new TestInter() {  //com/next/b/Test$2
            };
     }

字节码:

 L0
    LINENUMBER 8 L0
    ACONST_NULL
    ASTORE 1
   L1
    LINENUMBER 9 L1
    NEW com/nextcontrols/bureautest/Test$1
    DUP
    INVOKESPECIAL com/next/b/Test$1.<init>()V
    ASTORE 1
   L2
    LINENUMBER 11 L2
    NEW com/nextcontrols/bureautest/Test$2
    DUP
    INVOKESPECIAL com/next/b/Test$2.<init>()V
    ASTORE 1

注意INVOKESPECIAL字节码中的行

于 2012-12-27T17:29:05.513 回答
3

您可以通过尝试这样的简单示例来获得一些见解:

public class A {
    public static void main(String[] args)
    {
        L a = new L() { };
        L b = new L() { };
    }
}

interface L { }

运行上面的代码会生成 3 个单独的类文件:

A.class
A$1.class
A$2.class
于 2012-12-27T17:29:05.893 回答