Java: отримати усі імена змінних у класі


91

У мене є клас, і я хочу знайти всі його загальнодоступні поля (а не методи). Як я можу це зробити?

Дякую!


Ви повинні зробити це за допомогою API Reflection .
Крозін

Відповіді:


134
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пакет.


2
лише примітка - спочатку моя відповідь містила неправильне твердження, проте вона неодноразово голосувала за. Будь ласка, прочитайте уважніше;)
Божо

1
@downvoter - помилка була раніше. Якщо ви бачите його зараз, поділіться.
Божо

це рішення повільне? чи ми можемо ним користуватися вільно?
Dany Y

нічого страшного. Але не зловживайте цим.
Божо


15

Ви можете використовувати будь-який із двох залежно від ваших потреб:

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

Як згадували небагато користувачів, наведений нижче код може допомогти знайти всі поля в даному класі.

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());
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.