假设我有一个名为 SuperClass 的类:
public class SuperClass
{
protected void TheCake()
{
System.out.println("The cake is a lie");
}
}
另一个称为子类:
public class SubClass extends SuperClass
{
@Override
protected void TheCake()
{
System.out.println("The cake is not a lie");
}
}
在第三堂课我有这个方法
public void GetCake(SuperClass someObject)
{
Class clazz = someObject.getClass();
Method method = clazz.getMethod("TheCake");
method.invoke(someObject, (Object[])null));
}
这永远不会奏效,因为 TheCake 受到保护。所以如果我改变这一行:
Method method = clazz.getMethod("TheCake");
对此:
Method method = clazz.getDeclaredMethod("TheCake");
它只有在 someObject 是 SuperClass 的实例时才有效,如果它是 SubClass 的实例则失败,因为当然该方法是在 SuperClass 中声明的。
但是如果我这样做呢?
public void GetCake(SuperClass someObject)
{
Class clazz = SuperClass.class;
Method method = clazz.getDeclaredMethod("TheCake");
method.invoke(someObject, (Object[])null));
}
如果 someObject 是 SubClass 的一个实例,会调用什么方法?方法的 SuperClass 定义还是方法的 SubClass 覆盖?