java - 反射泛型获取字段值

标签 java reflection

我正在尝试通过反射获取字段的值。问题是我不知道字段的类型,并且必须在获取值时决定它。

此代码导致此异常:

Can not set java.lang.String field com....fieldName to 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);

另一种有时更受欢迎的方法是动态调用 getter。示例代码:

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。例如,获取给定类的所有字段;

    for (Class<?> c = someClass; c != null; c = c.getSuperclass())
    {
        Field[] fields = c.getDeclaredFields();
        for (Field classField : fields)
        {
            result.add(classField);
        }
    }

关于java - 反射泛型获取字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13400075/

相关文章:

java - 导航到名称相似的Java/Scala软件包

Java spring mvc : IllegalStateException: Cannot convert value of type [java. lang.String] 为所需类型

Java对子类的静态反射

java - 在 Java 中将函数式接口(interface)声明为变量可能有哪些缺点?

java - 使用 Entrez Utilities Web 服务访问 pubmed 摘要

java - Firebase 身份验证失败

.net - 反射 GetExecutingAssembly 正在抛出 StackOverflow

c# - 使用 System.Reflection

c# - .NET Core 中的程序集加载

visual-studio-2010 - 查找子类和实现