J'ai une classe et je veux trouver toutes les variables publiques (pas les fonctions). Comment puis-je le faire? Merci!
Field[] fields = YourClassName.class.getFields();
retourne un tableau de toutes les variables publiques de la classe.
getFields()
renvoie les champs de la classe entière. Si vous souhaitez que les champs ne soient définis que dans la classe en question, et non ses super-classes, utilisez getDeclaredFields()
, et filtrez ceux public
avec l'approche Modifier
suivante:
Modifier.isPublic(field.getModifiers());
Le littéral YourClassName.class
Représente en réalité un objet de type Java.lang.Class
. Vérifiez sa documentation pour des méthodes de réflexion plus intéressantes.
La classe Field
ci-dessus est Java.lang.reflect.Field
. Vous pouvez jeter un oeil à l'ensemble Java.lang.reflect
package.
https://docs.Oracle.com/javase/tutorial/reflect/class/classMembers.html . A également des graphiques pour localiser les méthodes et les constructeurs.
Vous pouvez utiliser n'importe lequel des deux en fonction de vos besoins:
Field[] fields = ClassName.class.getFields(); // returns inherited members but not private members.
Field[] fields = ClassName.class.getDeclaredFields(); // returns all members including private members but not inherited members.
Pour filtrer uniquement les champs publics de la liste ci-dessus (en fonction des besoins), utilisez le code ci-dessous:
List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
Collectors.toList());
Comme mentionné par quelques utilisateurs, le code ci-dessous peut aider à trouver tous les champs d'une classe donnée.
TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
String name=method.getName();
if(name.startsWith("get"))
{
System.out.println(name.substring(3));
}else if(name.startsWith("is"))
{
System.out.println(name.substring(2));
}
}
Cependant, une approche plus intéressante est ci-dessous:
Avec l'aide de la bibliothèque Jackson, j'ai pu trouver toutes les propriétés de classe de type String/integer/double et les valeurs respectives d'une classe Map. (sans utiliser les réflexions api!)
TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();
Map<String,Object> props = m.convertValue(testObject, Map.class);
for(Map.Entry<String, Object> entry : props.entrySet()){
if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
System.out.println(entry.getKey() + "-->" + entry.getValue());
}
}