2010-01-24 16 views

Respuesta

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

devuelve una matriz de todas las variables públicas de la clase.

getFields() devuelve los campos en toda la jerarquía de clases. Si usted quiere tener los campos definidos sólo en la clase en cuestión, y no sus superclases, utilice getDeclaredFields(), y filtrar los public queridos con la Modifier enfoque siguiente:

Modifier.isPublic(field.getModifiers()); 

El YourClassName.class literal representa en realidad un objeto de tipo java.lang.Class. Verifique sus documentos para obtener métodos de reflexión más interesantes.

La clase anterior Field es java.lang.reflect.Field. Puede echar un vistazo a todo el paquete java.lang.reflect.

+2

solo una nota: al principio, mi respuesta contenía una declaración incorrecta, pero se votó varias veces. Por favor, lea más atentamente;) – Bozho

+1

@downvoter - el error fue antes. Si ve uno ahora, por favor comparta. – Bozho

+0

¿esta solución es lenta? o podemos usarlo libremente? –

1

Como se ha mencionado por algunos usuarios, por debajo de código puede ayudar a encontrar todos los campos de una clase dada.

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)); 
    } 
} 

Sin embargo, un enfoque más interesante es continuación:

Con la ayuda de la biblioteca Jackson, yo era capaz de encontrar todas las propiedades de la clase de tipo String/entero/doble, y los valores respectivos en una clase de mapa. (sin utilizar reflexiones 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

Puede utilizar cualquiera de los dos en función de sus necesidades:

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. 

Para filtrar sólo los campos públicos de la lista anterior (basado en el requisito) el uso por debajo de código:

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