3

我四处寻找没有运气的解决方案,这就是我所拥有的以及我正在努力实现的目标

家长班

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'setField方法,然后调用MyAbstractParentClass'protected String getPrivateParentField()后记;

@Test
public void f(){
    Method[] m = MyChlidClass.class.getDeclaredMethods();
    for (Method method : m) {
        System.out.println(method.getName());
    }
}

但是上面的这段代码只返回MyChlidClass没有父类的声明方法protected,我怎么能访问受保护的方法?有任何想法吗?

非常感谢你:)

编辑 这是感兴趣的人的最终解决方案

MyChildClass child = new MyChildClass();
chlid.setField("FOO_BAR");

Method getPrivateParentField = child.getClass().getSuperclass().getDeclaredMethod("getPrivateParentField");
getPrivateParentField.setAccessible(true);

String result = (String) getPrivateParentField.invoke(child);
System.out.println((String)result); //prints out FOO_BAR

PS:有一些例外你可以捕捉或添加它们的抛出声明;

再次感谢您的帮助

4

4 回答 4

7

您可以通过调用获取超类方法

MyChlidClass.class.getSuperclass().getDeclaredMethods();
于 2012-05-18T09:30:54.300 回答
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());
}
于 2012-05-18T09:25:35.433 回答
1

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

于 2012-05-18T09:30:37.017 回答
0

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

于 2012-05-18T09:34:23.107 回答