通常、JAVA のリフレクション メカニズムを通じて他のクラスのプライベート フィールドやプライベート メソッドにアクセスできると考えられますが、それはそれほど難しいことではありません。
注:このコードは、単体テストや通常のプログラムと同様に、別の JAVA プログラムで実行した場合にのみ機能します。 JAVA APPLET 内でこのメソッドを使用しようとすると、SecurityManager を少し変更する必要があります。ただし、これに対処する必要はほとんどないため、ここでは詳しく説明しません。
このコンテンツのリストは次のとおりです。
1. プライベートフィールドにアクセスします。
2. プライベート メソッドにアクセスします。
プライベートフィールドにアクセスします。
プライベート フィールドにアクセスするには、Class.getDeclaredField(String name) メソッドまたは Class.getDeclaredFields() メソッドを呼び出す必要があります。 Class.getField(String name) メソッドと Class.getFields() メソッドは共通フィールドのみを返すため、効果はありません。以下は、プライベート フィールドを含むクラスの例です。クラスの下には、リフレクションを通じてプライベート フィールドにアクセスするコードがあります。
次のようにコードをコピーします。
パブリック クラス PrivateObject {
private String privateString = null //プライベートフィールドとして宣言されます。
public PrivateObject(String privateString) {
this.privateString = プライベートストリング;
}
}
次のようにコードをコピーします。
PrivateObject privateObject = new PrivateObject("The Private Value");// オブジェクトのインスタンスを作成します
フィールド privateStringField = PrivateObject.class.
getDeclaredField("privateString");
privateStringField.setAccessible(true);//プライベートフィールドへのアクセスを許可する
String fieldValue = (String) privateStringField.get(privateObject);//プライベートフィールド値を取得する
System.out.println("fieldValue = " + fieldValue);
このコードは、テキスト「fieldValue = The Private Value」を出力します。これは、オブジェクト PrivateObject のプライベート フィールド privateString の値です。
PrivateObject.class.getDeclaredfield("privateString") メソッドを使用していることに注意してください。プライベート フィールドを返すのは、このメソッドの呼び出しです。このメソッドは、指定されたクラスに基づいてフィールドのみを返し、親クラスによって宣言されたフィールドは返しません。
太字の記述もよく見てください。 Field.setAccessible(true) を呼び出すと、この指定されたフィールド インスタンスのアクセス チェックがオフになります。これはリフレクションに対してのみ有効です。これで、呼び出し元がそのスコープ内にない場合でも、プライベート、保護、デフォルトのいずれであってもアクセスできるようになります。コンパイラが許可していないため、通常のメソッドを介してフィールドにアクセスすることはできません。
プライベート メソッドへのアクセス<BR>プライベート メソッドにアクセスするには、Class.getDeclaredMethod(String name,Class[]parameterTypes) メソッドまたは Class.getDeclaredMethods() メソッドを呼び出す必要があります。 Class.getMethod(String name,Class[]parameterTypes) メソッドと Class.getMethods() メソッドはパブリック メソッドのみを返すため、何の役割も果たしません。以下は、プライベート メソッドを含むクラスの簡単な例です。クラスの下には、リフレクションを通じてプライベート メソッドにアクセスするコードがあります。
次のようにコードをコピーします。
パブリック クラス PrivateObject {
プライベート文字列プライベート文字列 = null;
public PrivateObject(String privateString) {
this.privateString = プライベートストリング;
}
private String getPrivateString(){//プライベート メソッド
this.privateString を返します。
}
}
次のようにコードをコピーします。
PrivateObject privateObject = new PrivateObject("プライベート値");
メソッド privateStringMethod = PrivateObject.class。
getDeclaredMethod("getPrivateString", null);
privateStringMethod.setAccessible(true);
文字列戻り値 = (文字列)
privateStringMethod.invoke(privateObject, null);
System.out.println("returnValue = " + returnValue);
このコード例では、テキスト「returnValue = The private Value」を出力します。これはプライベート メソッドの戻り値です。