[解決済み] Java リフレクション - setAccessible(true)の影響
2022-09-08 06:59:45
質問
クラス内のフィールドの値を動的に設定するために、いくつかのアノテーションを使用しています。私はそれが公開、保護、またはプライベートであるかに関係なくこれを行いたいので、私は
setAccessible(true)
を呼び出す前に毎回フィールドオブジェクト上で
set()
メソッドを呼び出します。私の疑問は
setAccessible()
の呼び出しは、フィールド自体にどのような影響を与えるのでしょうか?
より具体的には、それがプライベートなフィールドであり、この一連のコード呼び出しが
setAccessible(true)
. もし、コードの中の他の場所がリフレクションによって同じフィールドを取り出すとしたら、そのフィールドはすでにアクセス可能なのでしょうか?それとも
getDeclaredFields()
と
getDeclaredField()
メソッドは毎回Fieldオブジェクトの新しいインスタンスを返しますか?
質問を述べる別の方法は、もし私が
setAccessible(true)
を呼び出した場合、終了後に元の値に戻すことがどれほど重要なのでしょうか?
どのように解決するのですか?
とは
setAccessible()
の挙動を変更します。
AccessibleObject
の挙動を変更する、つまり
Field
のインスタンスであり、クラスの実際のフィールドではありません。ここでは
のドキュメントです。
(抜粋) を参照してください。
の値は
true
は、反映されたオブジェクトが使用される際に、Java言語のアクセス制御のチェックを抑制することを示します。
そして実行可能な例です。
public class FieldAccessible {
public static class MyClass {
private String theField;
}
public static void main(String[] args) throws Exception {
MyClass myClass = new MyClass();
Field field1 = myClass.getClass().getDeclaredField("theField");
field1.setAccessible(true);
System.out.println(field1.get(myClass)); // no exception
Field field2 = myClass.getClass().getDeclaredField("theField");
System.out.println(field2.get(myClass)); // IllegalAccessException
}
}
関連
-
maven レポート エラー 解決不可能な親POM
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
Javaでよくある構文エラー
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
Java Notes 005_この行に複数のマーカーがある - キーを変数に解決できない - シンタックスエラー、ins
-
keytool error: java.io.FileNotFoundException: cacerts (アクセス拒否されました。)
-
配列定数は初期化子でのみ使用可能です。
-
Javaがテキストファイルを読み込む
-
Java Runtime Environmentを継続するためのメモリが不足しています。