Java Reflectionチュートリアル(7):クラスプライベートメンバー変数とメソッド
1981 ワード
一般に、クラスのプライベートメンバー変数と呼び出しクラスのプライベートメソッドにアクセスできません.しかしJava Reflection APIではこの制限を迂回することができ,先に使用したgetMethods,getFields,getConstructorsなどの方法はいずれも返されるクラスのpublicメソッド,クラスメンバー,構築関数である.
この記事では、Java Reflection APIを使用してクラスのプライベートメンバーにアクセスする方法について説明します.
1.プライベートメンバーへのアクセス
ClassのgetDeclaredField(String name)とgetDeclaredFieldsは、クラスのすべてのメンバー変数にプライベートメンバー変数を含めることができます.
上記のコードは、メソッドクラスPrivateObjectのプライベートメンバーprivateStringを使用できます.privateStringField.setAccessible(true);プライベート・メンバーにアクセスするには、クラス・メンバーのアクセス制御を開く必要があります.クラスのプライベートメンバーにアクセスできるのはJava Reflection APIのみです.
2.アクセスクラスのプライベートメソッド
クラスのプライベートメソッドにアクセスするには、クラスのgetDeclaredMethod(String name)とgetDeclaredMethodsを使用します.
同様にprivateStringMethod.setAccessible(true)を呼び出す必要があります.プライベート・メソッドへのアクセス制御を開いてから、プライベート・メンバー・メソッドにアクセスできます.
この記事では、Java Reflection APIを使用してクラスのプライベートメンバーにアクセスする方法について説明します.
1.プライベートメンバーへのアクセス
ClassのgetDeclaredField(String name)とgetDeclaredFieldsは、クラスのすべてのメンバー変数にプライベートメンバー変数を含めることができます.
public class PrivateObject {
private String privateString = null;
public PrivateObject(String privateString) {
this.privateString = privateString;
}
}
....
PrivateObject privateObject = new PrivateObject("The Private Value");
Field privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);
String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);
上記のコードは、メソッドクラスPrivateObjectのプライベートメンバーprivateStringを使用できます.privateStringField.setAccessible(true);プライベート・メンバーにアクセスするには、クラス・メンバーのアクセス制御を開く必要があります.クラスのプライベートメンバーにアクセスできるのはJava Reflection APIのみです.
2.アクセスクラスのプライベートメソッド
クラスのプライベートメソッドにアクセスするには、クラスのgetDeclaredMethod(String name)とgetDeclaredMethodsを使用します.
public class PrivateObject {
private String privateString = null;
public PrivateObject(String privateString) {
this.privateString = privateString;
}
private String getPrivateString(){
return this.privateString;
}
}
...
PrivateObject privateObject = new PrivateObject("The Private Value");
Method privateStringMethod = PrivateObject.class.
getDeclaredMethod("getPrivateString", null);
privateStringMethod.setAccessible(true);
String returnValue = (String)
privateStringMethod.invoke(privateObject, null);
System.out.println("returnValue = " + returnValue);
同様にprivateStringMethod.setAccessible(true)を呼び出す必要があります.プライベート・メソッドへのアクセス制御を開いてから、プライベート・メンバー・メソッドにアクセスできます.