У меня есть класс, и я хочу найти все его открытые поля (не методы). Как я могу это сделать?
Спасибо!
У меня есть класс, и я хочу найти все его открытые поля (не методы). Как я могу это сделать?
Спасибо!
Field[] fields = YourClassName.class.getFields();
возвращает массив всех открытых переменных класса.
getFields()
возвращает поля во всей иерархии класса. Если вы хотите, чтобы поля, определенные только в рассматриваемом классе, а не его суперклассы, используйте getDeclaredFields()
и отфильтруйте теги public
со следующим подходом Modifier
:
Modifier.isPublic(field.getModifiers());
Литерал YourClassName.class
фактически представляет объект типа java.lang.Class
. Проверьте его документы для более интересных методов отражения.
Класс Field
выше java.lang.reflect.Field
. Вы можете взглянуть на пакет java.lang.reflect
.
https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html также есть диаграммы для определения местоположения методов и конструкторов.
Вы можете использовать любой из двух, исходя из ваших потребностей:
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.
Чтобы фильтровать только общедоступные поля из приведенного выше списка (на основе требования), используйте ниже код:
List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
Collectors.toList());
Как упоминалось несколькими пользователями, ниже код может помочь найти все поля в данном классе.
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));
}
}
Однако более интересный подход ниже:
С помощью библиотеки Джексона мне удалось найти все свойства класса типа String/integer/double и соответствующие значения в классе Map. (без использования отражений 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());
}
}