我创建了一个小的一次性类(它是Java 9,但我怀疑它有所不同)并使用javap来反汇编它,显然它们没有显式声明包含对外部类的引用的字段,这与实例方法中的匿名类不同.
这是源代码:
import java.util.function.Supplier;
/* Temporary program. */
public class Temp
{
static Supplier refSupplier(T obj)
{
return new Supplier<>()
{
public T get()
{
return null;
}
};
}
public static void main(String... args) {}
}
这是匿名供应商的反汇编类文件:
PS C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src> javap -c -p Temp`$1
Compiled from "Temp.java"
class Temp$1 implements java.util.function.Supplier {
Temp$1();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: return
public T get();
Code:
0: aconst_null
1: areturn
}
这是Temp的源代码,静态类替换了匿名类:
import java.util.function.Supplier;
/* Temporary program. */
public class Temp
{
static class UselessSupplier implements Supplier
{
@Override
public Object get()
{
return null;
}
}
public static void main(String... args) {}
}
这是它的字节码:
PS C:\Users\Sylvaenn\OneDrive\Documents\Programs\Java\src> javap -c -p Temp$`UselessSupplier
Compiled from "Temp.java"
class Temp$UselessSupplier implements java.util.function.Supplier {
Temp$UselessSupplier();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: return
public java.lang.Object get();
Code:
0: aconst_null
1: areturn
}
看来静态方法中声明的匿名类只是匿名静态类.