Reflection generic get field value

JavaReflection

Java Problem Overview


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?

Java Solutions


Solution 1 - Java

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

Solution 2 - Java

You should pass the object to get method of the field, so

  Field field = object.getClass().getDeclaredField(fieldName);    
  field.setAccessible(true);
  Object value = field.get(object);

Solution 3 - Java

I use the reflections in the toString() implementation of my preference class to see the class members and values (simple and quick debugging).

The simplified code I'm using:

@Override
public String toString() {
	StringBuilder sb = new StringBuilder();
	
	Class<?> thisClass = null;
	try {
		thisClass = Class.forName(this.getClass().getName());
		
		Field[] aClassFields = thisClass.getDeclaredFields();
		sb.append(this.getClass().getSimpleName() + " [ ");
		for(Field f : aClassFields){
			String fName = f.getName();
			sb.append("(" + f.getType() + ") " + fName + " = " + f.get(this) + ", ");
		}
		sb.append("]");
	} catch (Exception e) {
		e.printStackTrace();
	}
	
	return sb.toString();
}

I hope that it will help someone, because I also have searched.

Solution 4 - Java

Although it's not really clear to me what you're trying to achieve, I spotted an obvious error in your code: Field.get() expects the object which contains the field as argument, not some (possible) value of that field. So you should have field.get(object).

Since you appear to be looking for the field value, you can obtain that as:

Object objectValue = field.get(object);

No need to instantiate the field type and create some empty/default value; or maybe there's something I missed.

Solution 5 - Java

 Integer typeValue = 0;
 try {
     Class<Types> types = Types.class;
     java.lang.reflect.Field field = types.getDeclaredField("Type");
	 field.setAccessible(true);
	 Object value = field.get(types);
	 typeValue = (Integer) value;
 } catch (Exception e) {
	 e.printStackTrace();
 }

Solution 6 - Java

    ` 
//Here is the example I used for get the field name also the field value
//Hope This will help to someone
TestModel model = new TestModel ("MyDate", "MyTime", "OUT");
//Get All the fields of the class
 Field[] fields = model.getClass().getDeclaredFields();
//If the field is private make the field to accessible true
fields[0].setAccessible(true);
//Get the field name
  System.out.println(fields[0].getName());
//Get the field value
System.out.println(fields[0].get(model));
`
 

Solution 7 - Java

I post my solution in Kotlin, but it can work with java objects as well. I create a function extension so any object can use this function.

fun Any.iterateOverComponents() {

val fields = this.javaClass.declaredFields

fields.forEachIndexed { i, field ->

    fields[i].isAccessible = true
    // get value of the fields
    val value = fields[i].get(this)

    // print result
    Log.w("Msg", "Value of Field "
            + fields[i].name
            + " is " + value)
}}

Take a look at this webpage: https://www.geeksforgeeks.org/field-get-method-in-java-with-examples/

Solution 8 - Java

You are calling get with the wrong argument.

It should be:

Object value = field.get(object);

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionIdo BarashView Question on Stackoverflow
Solution 1 - JavaMariusView Answer on Stackoverflow
Solution 2 - JavaDmitry SpikhalskiyView Answer on Stackoverflow
Solution 3 - JavasilversmurfView Answer on Stackoverflow
Solution 4 - JavaCosti CiudatuView Answer on Stackoverflow
Solution 5 - JavaRahul sharmaView Answer on Stackoverflow
Solution 6 - JavaRANAJEET BARIKView Answer on Stackoverflow
Solution 7 - JavaIsaias CarreraView Answer on Stackoverflow
Solution 8 - JavaSebaView Answer on Stackoverflow