Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen

internet

Top Contributor
Hallo,

ich würde gerne dynamisch folgendes realisieren:
- Ich habe in einem Package verschiedene Klassen, die immer ein statisches Feld haben:
Java:
public static final String ENTITY_NAME = "123456789";

"123456789" unterscheidet sich von Klasse zu Klasse.

Ich hätte nun gerne eine Methode, mit der ich den Pfad des Package angebe, und dieser mir dann folgendes ausliest:
1) MyClass.ENTITY_NAME
-> Liest mir das Feld aus


2) new MyClass
-> Erstellt mir ein Objekt dieser Klasse

Wie kann ich das machen?
 
Das geht per Reflection:
Java:
Class<?> clazz = Class.forName(MyClass.ENTITY_NAME);
Object myObject = clazz.newInstance();

Allerdings verlierst Du dabei natürlich die Typinformationen. Wenn es einen gemeinsamen Basistyp gibt, kannst Du natürlich den verwenden.

EDIT: Das ist so natürlich ziemlich sinnfrei, da Du MyClass bereits in MyClass.ENTITY_NAME im Code hast. Da kannst Du auch gleich new MyClass() aufrufen.
 
Ich glaube, an dem hier scheitert's. "mit der ich den Pfad des Package angebe und dieser mir dann folgendes ausliest"
Er kennt die Klassen nicht.

@OP:
Alle Klassen in einem Package kriegst du so raus
Java:
var allClasses = new Reflections("package.name").getSubTypesOf(Object.class);
Dann kannst du pro erhaltener Klasse den passenden Konstruktor raussuchen mit
Code:
var constructor = aClass.getConstructor();
//oder
var constructor = aClass.getConstructor(Integer.class, String.class);
//oder was auch immer
und den rufst du dann mit newInstance auf.
 
Ok, ich suche mir nun nur die Entity Klassen, die mit @Column annotiert sind:

Java:
public static List<Class> findAllClassesFromPackage(String packages, Class<? extends Annotation> annotation) {

        Reflections reflections = new Reflections(packages);
        Set<Class<? extends Object>> allClasses = reflections.getTypesAnnotatedWith(annotation);

        List<Class> result = new ArrayList<>(allClasses);

        return result;

    }

Wie kann ich aber Vererbung noch berücksichtigen?
 
Schon mal class.getFields ausprobiert? Damit müsstest du alle Felder kriegen.

Alle Felder einer Klasse zu kriegen, ist meines Wissens nach von der Vererbung unabhängig. Falls ich mich da täusche, musst du dich nach oben durcharbeiten und auch von den Klassen die Felder abfragen.

Schau dir doch einfach mal alle Methoden an, welche die Klasse Class<T> bietet.
 
Mich würde ja immer noch etwas mehr Kontext interessieren. Ich habe das Gefühl, dass Du es vermutlich zu komplex aufziehst. Aber ohne Details zu kennen ist das nur ein Bauchgefühl, für das es keine Begründung gibt. Willst Du niht evtl. paar Details mehr geben?
 

Neue Themen


Zurück
Oben