java: получить все имена переменных в классе
У меня есть класс, и я хочу найти все его открытые переменные (не функции). как я могу это сделать? спасибо!
4 ответа:
Field[] fields = YourClassName.class.getFields();
возвращает массив всех открытых переменных класса.
getFields()
возвращает поля во всем классе-heirarcy. Если вы хотите, чтобы поля определялись только в рассматриваемом классе, а не в его суперклассах, используйтеgetDeclaredFields()
, иpublic
те, которые имеют следующиеModifier
подход:Modifier.isPublic(field.getModifiers());
The
YourClassName.class
литерал фактически представляет собой объект типаjava.lang.Class
. Проверьте его документы для более интересного отражения методы.The
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 и соответствующие значения в классе карты. (без использования 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()); } }