如何通过反射获取java中受保护方法的覆盖版本?

时间:2013-08-16 16:28:26

标签: java inheritance reflection override protected

假设我有一个名为SuperClass的类:

public class SuperClass
{
    protected void TheCake()
    {
        System.out.println("The cake is a lie");
    }
}

和另一个叫SubClass:

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覆盖方法?

1 个答案:

答案 0 :(得分:0)

如果您的“其他类”与SuperClass和SubClass在同一个包中 以下方法有效:
(省略了exeption处理)

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);
}