Besoin d'un "setteur" générique ... :s

Besoin d'un "setteur" générique ... :s - Java - Programmation

Marsh Posté le 27-08-2006 à 00:45:37    

Bonjour,
 
Je cherche à réaliser une fonction en java qui prend en entrée :  
- un objet quelconque ;
- un nom de d’attribut sous forme de String (correspondant à un attribut de l’objet) ;
- une valeur
 
Et qui set l’attribut avec la valeur passée en paramètre.
 
Je souhaiterais que ma fonction ait pour prototype :
 
public void GenericSet (Object obj, String attribut, String value)
{
// Ici on set l’attribut “attribut” de "obj" avec la valeur “value”
}
 
Je me creuse la tête mais je ne vois pas trop comment faire concrètement … :??:  

Reply

Marsh Posté le 27-08-2006 à 00:45:37   

Reply

Marsh Posté le 27-08-2006 à 03:36:31    

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 :
  1. obj.getClass().getField(attributeName).set(obj,value);


 
Ci-dessous un programme de démonstration.
 
Nicolas
 

Code :
  1. // Nicolas_75, 27 août 2006
  2. // appeler le fichier Exemple063_GenericSet.java
  3. import java.lang.reflect.Field;
  4. // Pour tester :
  5. class Employee {
  6.     public String salary = "1000";
  7. }
  8. public class Exemple063_GenericSet {
  9.    
  10.     public static void GenericSet(Object obj, String attributeName, String value) {
  11.         try {
  12.           obj.getClass().getField(attributeName).set(obj,value);
  13.         } catch (NoSuchFieldException e) {
  14.             e.printStackTrace();
  15.             // l'attribut n'existe pas au sein de l'objet
  16.         } catch (IllegalArgumentException e){
  17.             e.printStackTrace();
  18.             // problème avec Field.set()
  19.         } catch (IllegalAccessException e) {
  20.             e.printStackTrace();
  21.             // problème avec Field.set()
  22.         }
  23.     }
  24.    
  25.     public static void main(String[] args) {
  26.         Employee employee = new Employee();
  27.         System.out.println("Salaire de notre employé : "+employee.salary);
  28.         System.out.println("Procédons à une augmentation !" );
  29.         GenericSet(employee, "salary", "2000" );
  30.         System.out.println("Salaire de notre employé : "+employee.salary);
  31.     }
  32.    
  33.     // Résultat :
  34.     // Salaire de notre employé : 1000
  35.     // Procédons à une augmentation !
  36.     // Salaire de notre employé : 2000
  37. }

Reply

Marsh Posté le 27-08-2006 à 04:33:32    

L'api Common BeanUtils est la pour ca.
BeanUtils
static void setProperty(java.lang.Object bean, java.lang.String name, java.lang.Object value)  
          Set the specified property value, performing type conversions as required to conform to the type of the destination property.

Reply

Marsh Posté le 27-08-2006 à 15:58:48    

Merci pour la réponse c'est exactement ce que je recherchais :)
Je te rassure Nico_75 cela ne vient pas d'un défaut de conception, je sais parfaitement ce que je fais en touchant à cela :)
 
merci

Reply

Marsh Posté le 27-08-2006 à 16:25:36    

Pour ma part, je t'en prie.  :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed