Пожалуйста, ознакомьтесь с этими примерами классов.
А.java:
// A is not public
class A
{
public static void foo()
{
}
}
Б.джава:
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]);
}
}
С.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]);
// }
}
Метод «вызов» в main в C завершается с ошибкой:
IllegalAccessException: класс p.B не может получить доступ к члену класса A с модификаторами "public static"
Если метод «вызова» в C точно такой же, как переопределенный метод в p.B. Однако, если он раскомментирован, исключение не генерируется.
Почему разница?