如何在系统中识别匿名内部类?

时间:2012-12-27 17:23:07

标签: java jvm anonymous-class

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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