2016-07-08 5 views
-1

У меня есть экземпляр класса счета (назовем его сущность):Как получить все поля встроенных классов?

private String accountType; 
private List<String> attributes = new ArrayList<>(); 
private Date createdDate; 
private ContactInfo contactInfo; 
private AccountStatus accountStatus; 

Как вы можете видеть, что есть классы «ContactInfo» и «AccountStatus» внутри. Как я могу получить все поля в классе Account и все используемые классы, если у меня есть сущность?

Это то, что я пишу сейчас, которые возвращают только все поля данного объекта.

private static <T> List<Field> getFields(T entity) { 
    List<Field> fields = new ArrayList<>(); 
    Class clazz = entity.getClass(); 
    PropertyDescriptor[] propertyDescriptors; 
    try { 
    propertyDescriptors = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors(); 
    } catch (IntrospectionException e) { 
    // do something 
    } 
    for (PropertyDescriptor pd : propertyDescriptors) { 
    Field field = null; 
    Class klass = clazz; 
    while (klass != null && field == null) { 
     try { 
     field = klass.getDeclaredField(pd.getName()); 
     } catch (NoSuchFieldException e) { 
     klass = klass.getSuperclass(); 
     } 
    } 
    fields.add(field); 
    } 
    return fields; 
} 
+2

Просьба уточнить. Вам нужны типы всех полей ('Account')? –

+0

_Вы можете видеть, что существуют классы «ContactInfo» и «AccountStatus» внутри, подразумевает, что эти классы объявлены внутри 'Account'. Кажется, это не так. Вам просто нужны типы полей, объявленные в 'Account'. На какой объект вы ссылаетесь? –

+0

Я уже знаю, как получить поля в классе Account, как мне получить поля «ContactInfo» и «AccountStatus» тоже? –

ответ

1

Благодаря @Andreas новый он у меня решена:

private static <T extends BaseEntity> List<Field> getFields(T entity) { 
    List<Field> fields = new ArrayList<>(); 
    Class clazz = entity.getClass(); 
    PropertyDescriptor[] propertyDescriptors; 
    try { 
    propertyDescriptors = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors(); 
    } catch (IntrospectionException e) { 
    return fields; 
    } 
    for (PropertyDescriptor pd : propertyDescriptors) { 
    List<Field> subFields = getSettableFields(pd.getPropertyType()); 
    if (subFields.isEmpty()) { 
     try { 
     fields.add(clazz.getDeclaredField(pd.getName())); 
     } catch (NoSuchFieldException e) { 
     return fields; 
     } 
    } else { 
     fields.addAll(subFields); 
    } 
    } 
    return fields; 
} 
private static List<Field> getFields(Class<?> clazz) { 
    List<Field> fields = new ArrayList<>(); 
    PropertyDescriptor[] propertyDescriptors; 
    try { 
    propertyDescriptors = Introspector.getBeanInfo(clazz, Object.class).getPropertyDescriptors(); 
    } catch (IntrospectionException e) { 
    return fields; 
    } 
    for (PropertyDescriptor pd : propertyDescriptors) { 
    try { 
     fields.add(clazz.getDeclaredField(pd.getName())); 
    } catch (NoSuchFieldException e) { 
     return fields; 
    } 
    } 
    return fields; 
} 
Смежные вопросы