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することが可能かどうか教えてください。
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することが可能かどうか教えてください。
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を介して可能ですが、実行しないでください。親でプライベートメソッドを呼び出すと、クラスが無効な状態のままになり、予期しない動作が発生する可能性があります。
リフレクションを使用してそれを行うことができますが、そうする非常に正当な理由がない限り、最初に設計を再検討する必要があります。
以下のコードは、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;
}
}
getc protected を宣言する必要があります。まさにそのためです。
反省について:はい、可能です。ただし、メソッド オブジェクトで setAccessible を呼び出す必要があります。スタイル悪いし…;-)
リフレクションを使用して次のように試すことができます。
Method getCMethod = A.class.getDeclaredMethod("getC");
getCMethod.setAccessible(true);
getCMethod.invoke(new A());