从子类外部访问父类的受保护方法(使用反射或任何可行的方法)

时间:2012-05-18 09:20:47

标签: java testing reflection junit powermock

我四处寻找没有运气的解决方案,这就是我拥有的和我想要实现的目标

父类

public abstract class MyAbstractParentClass{
     private String privateParentField;

     protected String getPrivateParentField(){
          return privateParentField;
     }

     public void setField(String value){
          privateParentField = value;
     }
}

儿童班

public class MyChlidClass extends MyAbstractParentClass{
     @Override
     public void setField(String value){
          super.setField(value);
     }
}

我正在尝试拨打MyChlidClass的{​​{1}}方法,然后拨打setField的{​​{1}}后跟;

MyAbstractParentClass

但是上面的代码只返回protected String getPrivateParentField()中没有父类@Test public void f(){ Method[] m = MyChlidClass.class.getDeclaredMethods(); for (Method method : m) { System.out.println(method.getName()); } } 的声明方法,我怎样才能访问受保护的方法?有任何想法吗?

提前非常感谢你:)

修改 这是感兴趣的人的最终解决方案

MyChlidClass

PS:有一些例外,您可以为它们捕获或添加抛出声明;

再次感谢您的帮助

4 个答案:

答案 0 :(得分:6)

您可以通过调用

来获取超类方法
MyChlidClass.class.getSuperclass().getDeclaredMethods();

答案 1 :(得分:1)

您可以在扩展课程时提高可见性。您无需更改MyChlidClass的代码,只需扩展它:

public class MyGrandChlidClass extends MyChlidClass{

     @Override
     public String getPrivateParentField(){
          return super.getPrivateParentField();
     }
}

@Test
public void f(){
    MyGrandChlidClass myGrandChlidClass = new MyGrandChlidClass();
    myGrandChlidClass.setField("hello");
    System.out.println(myGrandChlidClass.getPrivateParentField());
}

答案 2 :(得分:1)

您无法直接从外部类访问受保护的方法。它只能从类或继承的类中访问。要从外部访问它,您必须在子类中创建一个调用父项的受保护方法的公共方法。

答案 3 :(得分:0)

在父类上使用getDeclaredMethods()以获取有关父类的受保护方法的信息。