匿名类、私有方法和反射
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.
如果我使用私有方法创建匿名 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.