1. ホーム

[解決済み】Javaで異なるクラスからプライベートフィールドの値を読み取る方法は?

2022-03-23 16:16:06

質問

サードパーティーのクラスがうまく設計されていません。 JAR の1つにアクセスする必要があります。 プライベート フィールドがあります。例えば なぜprivateフィールドを選択する必要があるのでしょうか?

class IWasDesignedPoorly {
    private Hashtable stuffIWant;
}

IWasDesignedPoorly obj = ...;

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

解決方法は?

プライベートフィールドにアクセスするには、そのフィールドをクラスの 宣言された フィールドを作成し、アクセスできるようにします。

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

EDIT によってコメントされているように アペルキンス フィールドにアクセスし、アクセス可能に設定し、値を取得することで Exception のみですが チェック済み 例外に注意する必要があるのは、上記のコメントです。

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

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

IllegalAccessException は、フィールドがアクセス可能でない場合に投げられます (たとえば、プライベートなフィールドで f.setAccessible(true) という行があります。

は、その RuntimeException が投げられる可能性があるのは、以下のいずれかです。 SecurityException は、(もしJVMの SecurityManager はフィールドのアクセシビリティを変更することを許可しない)、あるいは IllegalArgumentException を使用すると、そのフィールドのクラスの型でないオブジェクトでそのフィールドにアクセスしようとした場合、そのフィールドが使用されます。

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