2010-01-24 5 views

Répondre

94
Field[] fields = YourClassName.class.getFields(); 

renvoie un tableau de toutes les variables publiques de la classe.

getFields() Retourne les champs dans l'ensemble de la classe-héritabilité. Si vous voulez avoir les champs définis que dans la classe en question, et non ses superclasses, utilisez getDeclaredFields() et filtrer les public ceux avec l'approche Modifier suivante:

Modifier.isPublic(field.getModifiers()); 

Le YourClassName.class littéral représente en fait un objet de type java.lang.Class. Consultez ses documents 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.

+2

juste une note - initialement ma réponse contenait une fausse déclaration, mais il a été upvoted un certain nombre de fois. S'il vous plaît lire plus attentivement;) – Bozho

+1

@downvoter - l'erreur était avant. Si vous en voyez un maintenant, partagez s'il vous plaît. – Bozho

+0

cette solution est lente? ou pouvons-nous l'utiliser librement? –

1

Comme mentionné par quelques utilisateurs, le code ci-dessous peut aider à trouver tous les champs dans 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/entier/double, et les valeurs respectives dans une classe de la carte. (sans utiliser des reflets 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()); 
    } 
} 
3

Vous pouvez utiliser l'un des deux en fonction de votre besoin:

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) ci-dessous utilisent le code:

List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
    Collectors.toList()); 
Questions connexes