更新:这或多或少是一个骗局,结果证明是编译器魔术添加了一个构造函数来传递 build2 中的局部变量。
给定这样的接口:
public interface IFoo {
public int get();
}
下面的代码会打印 1、1、2,然后在尝试对 build2 返回的值调用 getClass().newInstance() 时抛出异常,但在对 build1 的返回值调用相同时不会。任何想法为什么?
public class Foo {
public static IFoo build1() {
return new IFoo() { public int get() { return 1; } };
}
public static IFoo build2(final int v) {
return new IFoo() { public int get() {return v;} };
}
public static void main(String[] args) throws Exception {
IFoo foo, bar;
foo = build1();
System.out.println(foo.get());
bar = foo.getClass().newInstance();
System.out.println(bar.get());
foo = build2(2);
System.out.println(foo.get());
bar = foo.getClass().newInstance();
System.out.println(bar.get());
}
}
我的调试器表明在 newInstance() 调用中,getConstructor0 抛出了 NoSuchMethodException。