Dynamisches abarbeiten von statischen Methode aus verschiedenen Klassen.

TomGrill

Mitglied
Ich habe mehrer Klasse die so aufgebaut sind:

Java:
public class KlasseA {
	public static void gibAus() {
		System.out.print("A");
	}
}


public class KlasseB {
	public static void gibAus() {
		System.out.print("B");
	}
}

Derzeit gibt es KlasseA, KlasseB, KlasseC, KlasseD, aber später können sich natürlich bei Bedarf noch weitere Klassen wie KlasseE, KlasseH etc. dazugesellen.

Aufrufende Klasse:
Java:
public class ProgrammStarten {
	public static void main(String[] args) {
		KlasseA.gibAus();
		KlasseB.gibAus();
		KlasseC.gibAus();
		KlasseD.gibAus();
	}
}

Ausgabe: ABCD

Wie programmiere ich die aufrufende Klasse ProgrammStarten so, dass automatisch alle existierenden Klassen, die KlasseX heißen, nacheinander die statische gibAus() Methode aufrufen. Wenn ich also vor dem nächsten Programmstart die KlasseE anlege. Soll die Ausgabe wie folgt lauten:

ABCDE

dabei möchte ich nicht nachträglich an der main() Methode per Hand folgende Zeile einfügen müssen:

Java:
KlasseE.gibAus();

oder wenn ich KlasseB und KlasseC lösche, soll die Ausgabe:

AD

sein.



Irgendwelche Ideen oder Vorschläge? Ich dachte daran alle Klassen, die eine gibAus() Methode haben in ein seperates Package zu packen und dann auszulesen welche Klassen in diesem Package sind, das ganze in ein Array zu speicher und dann per foreach durchzurattern. Gute Lösung? Wenn ja wie macht man das?


############

Oder etwas anders gefragt, wenn ich ein Variable mit dem Wert "KlasseB" habe. Wie kann ich eine Instanz der KlasseB erstellen ohne, dass ich den Wert der Variablen kenne, könnte ja auch "KlasseF" sein...
 
Zuletzt bearbeitet:
Das geht nur mit Reflection - oder alle Klassen erben von einer gemeinsamen Klasse oder alle Klassen implementieren das gleiche Interface
 
Java:
public interface NewInterface {
    public void gibAus();
}

public class KlasseA implements NewInterface {
    public void gibAus() {
        System.out.println("A");
    }
}

public class KlasseB implements NewInterface {
    public void gibAus() {
        System.out.println("B");
    }
}

for (NewInterface i : new NewInterface[]{new KlasseA(), new KlasseB()}) {
    i.gibAus();
}

Das wäre jetzt das maximale, was man aus Interfaces rausholen könnte. Mehr kann nur Reflection
 
ok Danke erstmal, das Problem ist nur, dass ich wenn ich KlasseC dazunehme hand an die for-Schleife legen muss und genau das soll ja dynamisch bzw. modular (wie ich jetzt durch paar Recherchen rausgefunden habe) funktioniere.

ServiceLoader könnte auch eine Lösung sein, ich probiers mal aus.
 
ok Danke erstmal, das Problem ist nur, dass ich wenn ich KlasseC dazunehme hand an die for-Schleife legen muss und genau das soll ja dynamisch bzw. modular (wie ich jetzt durch paar Recherchen rausgefunden habe) funktioniere.

ServiceLoader könnte auch eine Lösung sein, ich probiers mal aus.

Dann gehts nur mit reflection:
Java:
Reflections reflections = new Reflections("my.package");
        Set<Class<? extends MyClass>> applicationsToLoad = reflections.getSubTypesOf(MyClass.class);
        Class constructorVariables[] = new Class[]{ConstructorArg1.class,ConstructorArg2.class};
        Object constructorArguments[] = new Object[]{ConstructorArg1, ConstructorArg2};
        for (Class t : applicationsToLoad) {
            try {
                Constructor c = t.getConstructor(constructorVariables);
                MyClass newInstance = (MyClass) c.newInstance(constructorArguments);
                MyClass.gibAus()
            } catch (Exception ex) {
                Logger.getLogger(ApplicationManager.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

Di klassen die geladen werden sollen müssen MyClass extenden und im package my.package sein
 

Neue Themen


Zurück
Oben