サードパーティに設計が不十分なクラスがあり、そのプライベート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
スローされる可能性のある は(SecurityException
JVM がSecurityManager
フィールドのアクセシビリティの変更を許可しない場合)または (IllegalArgumentException
フィールドのクラスの型ではないオブジェクトのフィールドにアクセスしようとした場合)のいずれかです。
f.get("BOB"); //will throw IllegalArgumentException, as String is of the wrong type