如何通过JVM创建和识别匿名内部类?
例如,我可以创建几个相同接口的匿名内部类,每个内部类都有自己独特的实现。这些都可以在同一个(显式)类中,因此它所在的类不能是整个标识符。那么JVM使用什么信息来确定另一个匿名对象呢? (我唯一能想到的就是声明它的行号,但这似乎有点过于人性而不是真正的答案。)
有没有办法查看编译器为这些文件生成的.class
文件?或者它们是否在运行时动态创建?
答案 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