【问题标题】:how to get the overriden version of a protected method in java through reflection?java - 如何通过反射获取java中受保护方法的覆盖版本?
【发布时间】:2013-08-19 03:18:25
【问题描述】:

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

【问题讨论】:

  • 当你尝试它会发生什么?
  • 尝试一下似乎比输入整个问题更容易找到答案:-)
  • 我不能尝试,因为我不在学校,而且我家里的 java 开发环境是我父亲的,它的项目包杂乱无章,而且害怕搞砸。我不擅长java,我对语言理解得很好,但我没有使用IDE的经验,我只需要java,因为我在学校有关于它的课程。 C# 更适合我。
  • 您可以通过将代码放入 .java 文件并在命令行中编译它们,在 IDE 之外尝试一下。
  • 这是个好主意,我会看看如何做到这一点。

标签: java inheritance reflection overriding protected


【解决方案1】:

如果您的“其他类”与超类和子类在同一个包中
以下将起作用:
(省略异常处理)

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

【讨论】:

  • 是的,我就是这样做的。不过,它的工作原理很有趣。
猜你喜欢
  • 2011-08-04
  • 2014-09-21
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2013-07-01
  • 2012-01-22
  • 1970-01-01
  • 2011-11-06
相关资源
最近更新 更多