У мене є клас, і я хочу знайти всі його загальнодоступні поля (а не методи). Як я можу це зробити?
Дякую!
Відповіді:
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());
}
}