Bonjour,
Deux remarques préalables :
(1) à moins d'être un programmeur averti qui sait ce qu'il fait, recourir à de telles méthodes mettant en jeu l'introspection cache souvent un réel problème dans la conception de l'application ;
(2) il peut paraître inhabituel de changer directement un champ à l'intérieur de l'objet, alors qu'on utilise souvent des "setters" monObjet.setMonAttribute(new Value).
Ceci étant dit, si j'ai bien compris ce que tu demandes, cela se résume à une ligne :
Code :
- obj.getClass().getField(attributeName).set(obj,value);
|
Ci-dessous un programme de démonstration.
Nicolas
Code :
- // Nicolas_75, 27 août 2006
- // appeler le fichier Exemple063_GenericSet.java
- import java.lang.reflect.Field;
- // Pour tester :
- class Employee {
- public String salary = "1000";
- }
- public class Exemple063_GenericSet {
-
- public static void GenericSet(Object obj, String attributeName, String value) {
- try {
- obj.getClass().getField(attributeName).set(obj,value);
- } catch (NoSuchFieldException e) {
- e.printStackTrace();
- // l'attribut n'existe pas au sein de l'objet
- } catch (IllegalArgumentException e){
- e.printStackTrace();
- // problème avec Field.set()
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- // problème avec Field.set()
- }
- }
-
- public static void main(String[] args) {
- Employee employee = new Employee();
- System.out.println("Salaire de notre employé : "+employee.salary);
- System.out.println("Procédons à une augmentation !" );
- GenericSet(employee, "salary", "2000" );
- System.out.println("Salaire de notre employé : "+employee.salary);
- }
-
- // Résultat :
- // Salaire de notre employé : 1000
- // Procédons à une augmentation !
- // Salaire de notre employé : 2000
- }
|