Klassen-Namen und Felder in einem Spring Projekt auslesen

Spring bietet eine Reihe nützlicher Zubehör-Klassen um mit dem Framework zu arbeiten. Unter anderem ist es auch möglich, die in einem Projekt definierten Java-Klassen auszulesen und diverse Informationen darüber zu erhalten. Zum Beispiel könnte man damit alle Felder eines bestimmten Typs und einer bestimmten Annotation aus den im Projekt definierten Entities erhalten und mit diesen Informationen einen Daten-Export programmieren.

Möglich macht dies die Klasse ClassPathScanningCandidateComponentProvider.

Hier ein Beispiel:

ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);

// include filter welchem die Klassen gehorchen müssen
provider.addIncludeFilter(new RegexPatternTypeFilter(Pattern.compile(".*")));
// oder z.B. include Filter per Annotation (nur alle Entitiy Klassen)
provider.addIncludeFilter(new AnnotationTypeFilter(javax.persistence.Entity.class));

// hole alle Klassen die in dem übergebenen Package oder darunter definiert sind
final Set<BeanDefinition> classes = provider.findCandidateComponents("com.mycompany.project.entity");

for (BeanDefinition bean: classes) {
    Class<?> clazz = Class.forName(bean.getBeanClassName());
    Field[] fields = clazz.getDeclaredFields();

    // Name des packages (e.g. com.mycompany.project.entity.pk)
    String package = clazz.getPackage().getName();

    // Name der Klasse inkl. Package (z.B. com.mycompany.project.entity.Customer)
    String classNameFull = clazz.getName();

    // Name der Klasse (z.B. Customer)
    String classNameShort = clazz.getSimpleName();
    
    // Alle in der Klasse definierten Felder durchgehen
    for (int i = 0; i < fields.length; i++) {
        Field field = fields[i];
        Class<?> fieldClazz = field.getType();
         
        // Name des Feldes (z.B. firstname)
        String fieldName = field.getName();
    }
}
    
    

Mit diesem Beispiel erhält man schon einige nützliche Informationen über die definierten Klassen und kann damit arbeiten. Obwohl der Name BeanDefinition vermuten ließe, dass man nur Informationen über Java Beans erhält, ist es jedoch für alle in dem Projekt definierten Klassen möglich.