javareflection

Reflection generic get field value


I am trying to obtain a field's value via reflection. The problem is I don't know the field's type and have to decide it while getting the value.

This code results with this exception:

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

I tried to cast, but I get compilation errors:

field.get((targetType)objectValue)

or

targetType objectValue = targetType.newInstance();

How can I do this?


Solution

  • Like answered before, you should use:

    Object value = field.get(objectInstance);
    

    Another way, which is sometimes prefered, is calling the getter dynamically. example code:

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

    Also be aware that when your class inherits from another class, you need to recursively determine the Field. for instance, to fetch all Fields of a given class;

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