Tengo una clase y quiero encontrar todos sus campos públicos (no métodos). ¿Cómo puedo hacer esto?
¡Gracias!
Respuestas:
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 desea tener los campos definidos solo en la clase en cuestión, y no en sus superclases, use getDeclaredFields()
y filtre los public
que tienen el siguiente Modifier
enfoque:
Modifier.isPublic(field.getModifiers());
El YourClassName.class
literal realmente representa un objeto de tipo java.lang.Class
. Consulte sus documentos para conocer métodos de reflexión más interesantes.
La Field
clase anterior es java.lang.reflect.Field
. Puede echar un vistazo al java.lang.reflect
paquete completo .
https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html también tiene gráficos para localizar métodos y constructores.
Puede utilizar cualquiera de los dos según 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 solo los campos públicos de la lista anterior (según el requisito), use el siguiente código:
List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
Collectors.toList());
Como lo mencionaron algunos usuarios, el siguiente código puede ayudar a encontrar todos los campos en una clase determinada.
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, a continuación se muestra un enfoque más interesante:
Con la ayuda de la biblioteca de Jackson, pude encontrar todas las propiedades de clase de tipo String / integer / double y los valores respectivos en una clase Map. (¡ sin usar reflections 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());
}
}