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); ?
}
}
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");
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.
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?
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.