Java Reflectionチュートリアル(7):クラスプライベートメンバー変数とメソッド

1981 ワード

一般に、クラスのプライベートメンバー変数と呼び出しクラスのプライベートメソッドにアクセスできません.しかしJava Reflection APIではこの制限を迂回することができ,先に使用したgetMethods,getFields,getConstructorsなどの方法はいずれも返されるクラスのpublicメソッド,クラスメンバー,構築関数である.
この記事では、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)を呼び出す必要があります.プライベート・メソッドへのアクセス制御を開いてから、プライベート・メンバー・メソッドにアクセスできます.