108 votes

Comment boucler sur les attributs d'une classe en Java ?

Comment puis-je boucler sur les attributs d'une classe en java de manière dynamique.

Par exemple :

public class MyClass{
    private type1 att1;
    private type2 att2;
    ...

    public void function(){
        for(var in MyClass.Attributes){
            System.out.println(var.class);
        }
    }
}

Est-ce possible en Java ?

0voto

Benny Neugebauer Points 5393

Voici une solution qui trie les propriétés par ordre alphabétique et les imprime toutes avec leurs valeurs :

public void logProperties() throws IllegalArgumentException, IllegalAccessException {
  Class aClass = this.getClass();
  Field[] declaredFields = aClass.getDeclaredFields();
  Map logEntries = new HashMap<>();

  for (Field field : declaredFields) {
    field.setAccessible(true);

    Object[] arguments = new Object[]{
      field.getName(),
      field.getType().getSimpleName(),
      String.valueOf(field.get(this))
    };

    String template = "- Propriété : {0} (Type : {1}, Valeur : {2})";
    String logMessage = System.getProperty("line.separator")
            + MessageFormat.format(template, arguments);

    logEntries.put(field.getName(), logMessage);
  }

  SortedSet sortedLog = new TreeSet<>(logEntries.keySet());

  StringBuilder sb = new StringBuilder("Propriétés de la classe :");

  Iterator it = sortedLog.iterator();
  while (it.hasNext()) {
    String key = it.next();
    sb.append(logEntries.get(key));
  }

  System.out.println(sb.toString());
}

0voto

user7551211 Points 143

Il est possible d'utiliser pojo-analyzers qui permettront également d'accéder aux getters et setters du champ (sans réflexion).

@DetailedPojo
public class ClassWithStuff {
    public String someString;
    //many more fields
}
...
ClassWithStuff classWithStuff = new ClassWithStuff("myString");
// Pojo Analyzers will automatically create a class named DetailedClassWithStuff
DetailedClassWithStuff.list.stream()
    .forEach(fieldDetails -> 
            System.out.println(fieldDetails.getFieldValue(classWithStuff)); // "myString"

La bibliothèque utilise le traitement des annotations donc il n'y a pas de réflexion impliquée - la solution la plus rapide possible.

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