2017-03-28 2 views
0

Ich habe eine Schnittstelle, LogParser, bestehend aus einer einzigen Methode parse(String x). Ich habe auch eine ArrayList, die die Namen mehrerer Klassen enthält, die alle LogParser implementieren. Ist es möglich, diese Liste von Klassennamen zu durchlaufen und ihre jeweiligen Klassen dynamisch zu instanziieren und parse(String x) aufzurufen?Klassen dynamisch instantiieren, die eine Schnittstelle implementieren und Schnittstellenmethode aufrufen

Das Problem, das ich hatte, ist, dass die Klassen keine Zero-Argument-Konstruktoren haben, so dass ich in InstantiationException viel versucht habe, die Parse-Methode durch Reflektion aufzurufen.

Danke!

Antwort

0

Wenn die Implementierungstypen keine Konstruktoren haben, wird es sehr schmerzhaft sein. Der einfachste Weg, dies zu tun, ist wahrscheinlich, ein Abhängigkeitsinjektions-Framework wie Spring oder Guice zu verwenden.

Im Frühjahr konnte man nur ein List<LogParser> injizieren, und Sie würden alle bekannten Implementierungen erhalten:

@Autowired 
private List<LogParser> parsers; 

Jetzt natürlich würden Sie jedem der LogParser s separat als Spring-Bean definieren.

Es gibt ähnliche Funktionen auch in anderen Frameworks.

0

Sie müssen einen Konstruktor aufrufen, um ein Objekt sinnvoll zu instanziieren. Sie verwenden Reflektion, um die Method für den Konstruktor zu greifen, und Sie instanziieren damit. Siehe Instantiate a class object with constructor that accepts a string parameter?. Ich habe nicht als Duplikat geschlossen, da Sie die zusätzliche Frage haben: Wissen Sie, dass alle Ihre Klassen einen Konstruktor mit der gleichen Signatur haben?

Verwandte Themen