0

私はちょうど考えていて、疑問に思いました: アクセス制御は事故に対する保護を提供することのみを目的としており、詐欺に対する保護を提供することを意図していないため、Java の隠し変数の値にアクセスできるかどうか疑問に思っていました。

たとえば、

public Cat {

public int numberOfLegs = 4;
private int numberOfWhiskers = 42;

}

このクラスの外から numberOfWhiskers の値を見つけることは可能ですか?

編集:リンクのスレッドを読みましたが、 SetAccesible() を使用すると、名前を知っているプラ​​イベートフィールドの値を取得できることがわかります。名前がわからないフィールドの値を見つけることができますか?

注: これは、C++ などの一部の言語で実行できます。たとえば、クラス内のフィールド間で反復するポインターを使用します。

4

1 に答える 1

3

リフレクションを使用してprivateチェックをバイパスできます。Class#getDeclaredFieldメソッド、およびメソッドを使用しますField#getInt(他のアクセサーがあります)。

このコードは別のクラスにある場合があります。

Cat myCat = new Cat();
int whiskers;

try
{
    Field field = Cat.class.getDeclaredField("numberOfWhiskers");
    // This line bypasses the private control
    field.setAccessible(true);
    whiskers = field.getInt(myCat);
}
catch (NoSuchFieldException e) { /* Handle */ }
catch (IllegalAccessException e) { /* Handle */ }

編集

重複した質問へのリンクを見ました。私は同意しなければなりません、通常、これをしないでください。

2回目の編集

追加の編集された質問に応答して、Class#getDeclaredFieldsメソッドを使用して を返すField[]ことができます。これを使用して、クラスのすべてのフィールドを反復処理できます。

Field[] fields = Cat.class.getDeclaredFields();
// Iterate over the array here.
于 2013-04-02T22:16:08.203 に答える