Java: получить все имена переменных в классе - PullRequest
80 голосов
/ 24 января 2010

У меня есть класс, и я хочу найти все его публичные переменные (не функции). как я могу это сделать? спасибо!

Ответы [ 4 ]

121 голосов
/ 24 января 2010
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.

33 голосов
/ 16 сентября 2016

https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html. Также есть диаграммы для определения местоположения методов и конструкторов.

enter image description here

11 голосов
/ 26 октября 2017

Вы можете использовать любой из двух в зависимости от ваших потребностей:

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());
2 голосов
/ 23 марта 2017

Как отмечают немногие пользователи, приведенный ниже код может помочь найти все поля в данном классе.

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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...