与Java反射不一致的行为';调用&x27;方法
请参见这些示例类 A.java:与Java反射不一致的行为';调用&x27;方法,java,reflection,Java,Reflection,请参见这些示例类 A.java: // A is not public class A { public static void foo() { } } B.java: package p; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class B { public void invoke() throws Clas
// A is not public
class A
{
public static void foo()
{
}
}
B.java:
package p;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class B
{
public void invoke() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException
{
Class clazz = Class.forName("A");
Method method = clazz.getDeclaredMethod("foo", new Class[0]);
method.invoke(null, new Object[0]);
}
}
C.java:
import java.lang.reflect.InvocationTargetException;
public class C extends p.B
{
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException
{
C c = new C();
c.invoke();
}
// @Override
// public void invoke() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException
// {
// Class clazz = Class.forName("A");
// Method method = clazz.getDeclaredMethod("foo", new Class[0]);
// method.invoke(null, new Object[0]);
// }
}
C中main中的“invoke”方法失败,原因是:
IllegalAccessException:类p.B无法使用修饰符“public static”访问类a的成员
如果C中的“invoke”方法与p.B中的重写方法完全相同,但是,如果未注释,则不会引发异常
为什么不同?类
A
是包私有的。由于A
和C
在同一个(默认)包中,因此从类C
中的任何代码调用A.foo()
,而不是从类B
中调用A.foo()
,这是一种合法的访问权限,因为类C
中的代码位于不同的包中
如果重写该方法,将从同一个包中调用A.foo()
。如果不重写该方法,将从另一个包中的代码调用A.foo()
,这是非法访问
只需在相应的
invoke()
方法中添加语句A.foo()
,就可以复制类似的行为。但是,在这种情况下,您将得到一个编译错误,而不是运行时错误。a类在哪个包中?C类是什么包裹?谢谢你的回复。通过调用A.foo()来复制它是正确的,这样行为是一致的。我不喜欢的是,调用invoke()的对象是C类的对象,而不是B类的对象,它只继承了B类。所以它的行为应该是一个,允许调用包私有的A。其他观点?这只是多态性的工作方式,方法在B类中,所以不管它是什么类型的对象。如果只是扩展某个类就可以访问其包中的所有内容。。。那么整个可视性的事情就没用了。