1. ホーム
  2. java

[解決済み] リフレクション汎用フィールド値取得

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);
        }
    }