18
public class A{
    private int getC(){
        return 0;
    }
}

public class B extends A{
    public static void main(String args[]){
        B = new B();
        //here I need to invoke getC()
    }
}

Javaでリフレクションを介してsushすることが可能かどうか教えてください。

4

5 に答える 5

20
class A{
    
    private void a(){
        System.out.println("private of A called");
    }
}

class B extends A{
    
    public void callAa(){
        try {
            System.out.println(Arrays.toString(getClass().getSuperclass().getMethods()));
            Method m = getClass().getSuperclass().getDeclaredMethod("a", new Class<?>[]{});
            m.setAccessible(true);
            m.invoke(this, (Object[])null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

編集:これは静かな古い投稿ですが、アドバイスのナゲットをいくつか追加します

デザインを再考する

親のプライベートメソッドを呼び出すことは、Reflectionを介して可能ですが、実行しないでください。親でプライベートメソッドを呼び出すと、クラスが無効な状態のままになり、予期しない動作が発生する可能性があります。

于 2013-01-18T11:55:58.467 に答える
10

リフレクションを使用してそれを行うことができますが、そうする非常に正当な理由がない限り、最初に設計を再検討する必要があります。

以下のコードは、A の外部から呼び出された場合でも 123 を出力します。

public static void main(String[] args) throws Exception {
    Method m = A.class.getDeclaredMethod("getC");
    m.setAccessible(true); //bypasses the private modifier
    int i = (Integer) m.invoke(new A());
    System.out.println("i = " + i); //prints 123
}

public static class A {

    private int getC() {
        return 123;
    }
}
于 2013-01-18T11:45:31.520 に答える
4

getc protected を宣言する必要があります。まさにそのためです。

反省について:はい、可能です。ただし、メソッド オブジェクトで setAccessible を呼び出す必要があります。スタイル悪いし…;-)

于 2013-01-18T11:46:16.053 に答える
0

リフレクションを使用して次のように試すことができます。

    Method getCMethod = A.class.getDeclaredMethod("getC");
    getCMethod.setAccessible(true);
    getCMethod.invoke(new A());
于 2013-01-18T11:45:40.143 に答える