Java で別のクラスからプライベート フィールドの値を読み取るにはどうすればよいでしょうか? 質問する

Java で別のクラスからプライベート フィールドの値を読み取るにはどうすればよいでしょうか? 質問する

サードパーティに設計が不十分なクラスがあり、そのプライベートJARフィールドの 1 つにアクセスする必要があります。たとえば、プライベート フィールドを選択する必要があるのはなぜですか?

class IWasDesignedPoorly {
    private Hashtable stuffIWant;
}

IWasDesignedPoorly obj = ...;

リフレクションを使用して の値を取得するにはどうすればよいですかstuffIWant?

ベストアンサー1

プライベート フィールドにアクセスするには、クラスの宣言されたフィールドからそれらを取得して、アクセスできるようにする必要があります。

Field f = obj.getClass().getDeclaredField("stuffIWant"); //NoSuchFieldException
f.setAccessible(true);
Hashtable iWantThis = (Hashtable) f.get(obj); //IllegalAccessException

編集: aperkinsがコメントしたように、フィールドへのアクセス、フィールドをアクセス可能として設定すること、および値を取得することのいずれも例外をスローする可能性がありますが、注意する必要があるチェック済み例外は上記でコメントされているExceptionものだけです。

NoSuchFieldException宣言されたフィールドに対応しない名前でフィールドを要求した場合、がスローされます。

obj.getClass().getDeclaredField("misspelled"); //will throw NoSuchFieldException

フィールドにアクセスできない場合 (たとえば、フィールドがプライベートであり、行IllegalAccessExceptionが欠落しているためにアクセスできない場合) は、エラーがスローされます。f.setAccessible(true)

RuntimeExceptionスローされる可能性のある は(SecurityExceptionJVM がSecurityManagerフィールドのアクセシビリティの変更を許可しない場合)または (IllegalArgumentExceptionフィールドのクラスの型ではないオブジェクトのフィールドにアクセスしようとした場合)のいずれかです。

f.get("BOB"); //will throw IllegalArgumentException, as String is of the wrong type

おすすめ記事