-1

假设我有一个名为 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 覆盖?

4

1 回答 1

0

如果您的“其他类”与 SuperClass 和 SubClass 位于同一包中,
则以下内容将起作用:(
省略异常处理)

public void GetCake(SuperClass someObject) {
    Class clazz = someObject.getClass();
    Method method = clazz.getDeclaredMethod("TheCake");
    method.invoke(someObject);
}

如果您希望此代码在另一个包中工作,您可以修改方法访问method.setAccessible(true);

您的最终方法将如下所示:

public void GetCake(SuperClass someObject) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
    Class clazz = someObject.getClass();
    Method method = clazz.getDeclaredMethod("TheCake");
    method.setAccessible(true);
    method.invoke(someObject);
}
于 2013-08-16T18:55:12.750 回答