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