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

MyChlidClasssetFieldメソッドを呼び出してから、MyAbstractParentClassprotected 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

クラス外から保護されたメソッドに直接アクセスすることはできません。クラスまたは継承されたクラス内からのみアクセスできます。これに外部からアクセスするには、子クラスで親の protected メソッドを呼び出す public メソッドを作成する必要があります。

于 2012-05-18T09:30:37.017 に答える
0

親クラスで使用getDeclaredMethods()して、親クラスの保護されたメソッドに関する情報を取得します。

于 2012-05-18T09:34:23.107 に答える