2016-07-08 7 views
-1

ich eine Instanz der Klasse Konto haben (wir es Unternehmen nennen):Wie bekomme ich alle Felder von eingebetteten Klassen?

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

Wie Sie Klassen „Contact“ und „AccountStatus“ sehen können gibt es im Inneren sind. Wie kann ich alle Felder in der Account-Klasse und alle verwendeten Klassen abrufen, vorausgesetzt, dass ich die Entität habe?

Das ist was ich jetzt schreibe, die nur alle Felder in der gegebenen Entität zurückgeben.

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

Bitte klären. Sie möchten die Typen aller seiner (? Account's) Felder? –

+0

_Wie Sie sehen können, gibt es die Klassen "ContactInfo" und "AccountStatus" inside_ impliziert, dass diese Klassen in "Account" deklariert sind. Das scheint nicht der Fall zu sein. Sie möchten nur die Typen der Felder, die in "Account" deklariert sind. Auf welches Objekt beziehen Sie sich? –

+0

Ich weiß bereits, wie man Felder in der Account-Klasse bekommt, wie bekomme ich auch Felder von "ContactInfo" und "AccountStatus"? –

Antwort

1

Dank neu @Andreas Ich habe es gelöst:

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; 
} 
Verwandte Themen