[解決済み] リフレクション汎用フィールド値取得
2022-03-07 23:01:09
質問
あるフィールドの値をリフレクションで取得しようとしています。問題は、フィールドの型を知らないので、値を取得するときにそれを決定しなければならないことです。
このコードでは、このような例外が発生します。
java.lang.String フィールド com....fieldName を java.lang.String に設定できない。
Field field = object.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
Class<?> targetType = field.getType();
Object objectValue = targetType.newInstance();
Object value = field.get(objectValue);
キャストしてみましたが、コンパイルエラーが出ます。
field.get((targetType)objectValue)
または
targetType objectValue = targetType.newInstance();
どうすればいいのでしょうか?
どのように解決するのですか?
以前回答したように、使用する必要があります。
Object value = field.get(objectInstance);
もう一つの方法は、ゲッターを動的に呼び出すことです。
public static Object runGetter(Field field, BaseValidationObject o)
{
// MZ: Find the correct method
for (Method method : o.getMethods())
{
if ((method.getName().startsWith("get")) && (method.getName().length() == (field.getName().length() + 3)))
{
if (method.getName().toLowerCase().endsWith(field.getName().toLowerCase()))
{
// MZ: Method found, run it
try
{
return method.invoke(o);
}
catch (IllegalAccessException e)
{
Logger.fatal("Could not determine method: " + method.getName());
}
catch (InvocationTargetException e)
{
Logger.fatal("Could not determine method: " + method.getName());
}
}
}
}
return null;
}
また、クラスが他のクラスを継承する場合、再帰的にFieldを決定する必要があることに注意してください。例えば、与えられたクラスのすべてのFieldを取得する場合です。
for (Class<?> c = someClass; c != null; c = c.getSuperclass())
{
Field[] fields = c.getDeclaredFields();
for (Field classField : fields)
{
result.add(classField);
}
}
関連
-
[解決済み] リフレクションを使用して文字列からプロパティ値を取得する
-
[解決済み] 警告: コンテキスト初期化中に例外が発生 - 更新の試みはキャンセルされました。
-
[解決済み] JAVA_OPTIONS、JAVA_TOOL_OPTIONS、JAVA_OPTSの違いについて
-
[解決済み] Javaで配列に特定の値が含まれているかどうかを判断するにはどうすればよいですか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] Javaで汎用配列を作成する方法は?
-
[解決済み】Javaではfinallyブロックは必ず実行されるのですか?
-
[解決済み] リフレクションによるゲッターの最適な起動方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] HashMapのtoString関数はなぜ異なる順序で自分自身を印刷するのですか?
-
[解決済み] ボタンでTextFieldをクリアする(Java)
-
[解決済み] プロトコルハンドラの初期化に失敗しました。
-
[解決済み] Eclipse- Dynamic Web Module 3.0 で新しいプロジェクトを作成するときに Java 1.6 以降が必要なエラーが発生する。
-
[解決済み] JOGLまたはLWJGLの既成のプロジェクト
-
[解決済み] JavaにおけるMouseListenerとMouseAdapterの違いについて
-
[解決済み] Apache Camelのログに簡単なテキストを記録する
-
[解決済み] アクティビティに割り当てられない
-
[解決済み] Eclipseでクラスとそれに対応するファイルの名前を変更する方法は?
-
[解決済み] init-paramとcontext-param