匿名类、私有方法和反射

Anonymous classes, private methods, and reflection

如果我使用私有方法创建匿名 class,并尝试使用反射访问该方法,它将抛出 IllegalAccessException。但是,如果我在将对象保存到变量之前调用该对象的方法,它工作正常:

public class Z {
    public static void main(String[] args) throws Exception {

        Object obj = new Object(){private void foo(){}};            
        obj.getClass().getDeclaredMethod("foo").invoke(obj); // throws IllegalAccessException

        new Object(){private void foo(){}}.foo(); // works
    }
}

造成差异的原因是什么?

在第一种情况下,您试图通过反射访问该方法,并且由于它是一个私有方法,反射器 class 无法调用它,因此它抛出一个 IllegalAccessException

在第二种情况下,您直接访问该方法,并且您可以这样做,因为它是 class 到 Z 的匿名内部,并且您在 Z 中访问它=11=] class.