【发布时间】:2017-02-02 20:26:24
【问题描述】:
我对以下情况感到困惑。
考虑两个包 a 和 b 具有以下类:
1) MethodInvoker 只是在给定对象上调用 call():
package b;
import java.util.concurrent.Callable;
public class MethodInvoker {
public static void invoke(Callable r) throws Exception {
r.call();
}
}
2)
package a;
import b.MethodInvoker;
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
public class Test {
private static Void method() {
System.out.println("OK");
return null;
}
public static void main(String[] args) throws Exception {
Method method = Test.class.getDeclaredMethod("method");
method.invoke(null); // ok
// TEST 1
MethodInvoker.invoke(() -> {
return method.invoke(null); // ok (hmm....
});
// TEST 2
MethodInvoker.invoke(new Callable() {
@Override
public Object call() {
return method(); // ok (hm...???
}
});
// TEST 3
MethodInvoker.invoke(new Callable() {
@Override
public Object call() throws Exception {
return method.invoke(null); // throws IllegalAccessException, why???
}
});
}
}
我明确地将method() private 用于测试如何在Test 类范围之外调用它。而且我通常对所有 3 个案例都感到困惑,因为我发现它们相互矛盾。
我通常希望它们都应该以相同的方式工作。至少我希望如果 TEST 3 抛出 IllegalAccessException,那么 TEST 2 也应该这样做。但是 TEST 2 工作正常!
有人可以根据 JLS 给出严格的解释,为什么每个案例都能正常工作?
【问题讨论】:
-
“有争议”你的意思是矛盾的吗?
-
@BT 或许“矛盾”更合适,是的
标签: java reflection lambda java-8 jls