web-dev-qa-db-fra.com

java: récupère tous les noms de variables dans une classe

J'ai une classe et je veux trouver toutes les variables publiques (pas les fonctions). Comment puis-je le faire? Merci!

80
ufk
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.

123
Bozho

https://docs.Oracle.com/javase/tutorial/reflect/class/classMembers.html . A également des graphiques pour localiser les méthodes et les constructeurs.

enter image description here

33
cellepo

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());
11
Sahil Chhabra

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());
    }
}
2
Anamika