如何通过反射获得java中受保护方法的重写版本?

如何通过反射获得java中受保护方法的重写版本?,java,inheritance,reflection,overriding,protected,Java,Inheritance,Reflection,Overriding,Protected,假设我有一个叫做超类的类: public class SuperClass { protected void TheCake() { System.out.println("The cake is a lie"); } } 还有一个叫做子类: public class SubClass extends SuperClass { @Override protected void TheCake() { System.

假设我有一个叫做超类的类:

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));
}
这是行不通的,因为蛋糕是受保护的。因此,如果我改变这一行:

Method method = clazz.getMethod("TheCake");
为此:

Method method = clazz.getDeclaredMethod("TheCake");
只有当someObject是超类的实例时,它才会工作,而当它是子类的实例时,它就会失败,因为该方法是在超类中声明的

但如果我这样做呢

public void GetCake(SuperClass someObject)
{
    Class clazz = SuperClass.class;
    Method method = clazz.getDeclaredMethod("TheCake");
    method.invoke(someObject, (Object[])null));
}

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

当你尝试它时会发生什么?尝试这个似乎比键入整个问题要容易得多:-)我不能尝试,因为我不在学校,家里的java开发环境是我爸爸的,它被他的项目包弄得乱七八糟,并且害怕把事情搞砸。我不擅长java,我对该语言理解得相当好,但我没有使用IDE的经验,我只需要java,因为我在学校有关于它的课程。C#更多的是在我的confort专区。你可以把代码放到.java文件中,然后在命令行中编译它们,让它走出IDE。这是一个好主意,我会看看如何做到这一点。是的,我就是这么做的。不过,它起作用的事实很有趣。
public void GetCake(SuperClass someObject) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
    Class clazz = someObject.getClass();
    Method method = clazz.getDeclaredMethod("TheCake");
    method.setAccessible(true);
    method.invoke(someObject);
}