与Java反射不一致的行为';调用&x27;方法

与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.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 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类中,所以不管它是什么类型的对象。如果只是扩展某个类就可以访问其包中的所有内容。。。那么整个可视性的事情就没用了。