168 votes

Valeur d'un champ générique de Reflection

J'essaie d'obtenir la valeur d'un champ par réflexion. Le problème est que je ne connais pas le type du champ et que je dois le décider en obtenant la valeur.

Ce code résulte avec cette exception :

Impossible de définir le champ com....fieldName de java.lang.String en 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);

J'ai essayé de faire un casting, mais j'obtiens des erreurs de compilation :

field.get((targetType)objectValue)

ou

targetType objectValue = targetType.newInstance();

Comment puis-je le faire ?

178voto

Marius Points 726

Comme répondu précédemment, vous devez utiliser :

Object value = field.get(objectInstance);

Une autre façon, qui est parfois préférée, est d'appeler le getter dynamiquement. Exemple de 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;
}

Sachez également que lorsque votre classe hérite d'une autre classe, vous devez déterminer le champ de manière récursive. Par exemple, pour récupérer tous les champs d'une classe donnée ;

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

164voto

Vous devez passer le objet a obtenir de la méthode champ donc

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

23voto

silversmurf Points 95

J'utilise les réflexions dans l'implémentation de toString() de ma classe de préférence pour voir les membres et les valeurs de la classe (débogage simple et rapide).

Le code simplifié que j'utilise :

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

J'espère que cela aidera quelqu'un, car j'ai aussi fait des recherches.

10voto

Rahul sharma Points 139
 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();
 }

5voto

RANAJEET BARIK Points 55
    ` 
//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));
`

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X