web-dev-qa-db-fra.com

Java obtenir la valeur de la propriété par nom de propriété

Est-il possible en Java d’obtenir la valeur de la propriété de la classe par son nom? Par exemple, j’ai une classe comme

public class Test {
    private String field;
    public String getField() {...}
    public void setField() {...}
}

et une autre classe avec carte

public class Main {
    private static final Map<String, Long> map = new HashMap<String, Long>();
    static {
        map.put("field", new Long(1));
    }
    public void doSth() {
    Set<String> keys = map.keySet();
    Test t = new Test();
    for (String key : keys) {
    //t.getPropertyValueByName(key); ?
    }
    }
11
kassie

Vous pouvez utiliser certaines des bibliothèques offrant un accès basé sur les propriétés. Je pense que le plus connu et utilisé est beanutils . Vous pouvez trouver un bon exemple de beanutils "en action" ici . Quelques exemples de code:

A someBean = new A();

// access properties as Map
Map<String, Object> properties = BeanUtils.describe(someBean);
properties.set("name","Fred");
BeanUtils.populate(someBean, properties);

// access individual properties
String oldname = BeanUtils.getProperty(someBean,"name");
BeanUtils.setProperty(someBean,"name","Barny"); 
11
Dan94

Oui. Vous pouvez remplacer la ligne commentée par t.getClass (). GetField (map.get (clé)). Get (t). qui va récupérer la valeur du champ sur t.

5
bjc2406

la réponse de bjc2406 fonctionne correctement tant que le (s) champ (s) en question sont accessibles:

t.getClass (). getField (map.get (clé)). get (t)

Si vous ne pouvez pas raisonnablement rendre public, les API de réflexion et autres API d'accès aux champs doivent faire le travail: Comment lire un champ privé en Java?

1
Danny Salvadori

La question est à quelle fréquence les propriétés changent-elles? Sont les constantes, ou cela dépendra-t-il de la situation?

Si c'est le dernier cas, ce qui est souvent le cas, vous voulez que les propriétés soient dans un fichier externe. L'API des propriétés Java standard convient parfaitement à cet objectif: http://docs.Oracle.com/javase/7/docs/api/Java/util/Properties.html .

Si vous utilisez un cadre tel que Spring, il comportera également des méthodes standard pour gérer les propriétés. Regardez dans leur documentation.

0
Jesse van Bekkum