2017-06-21 3 views
1

Basis verwenden Wenn Sie eine Liste von Klassennamen in einer Liste haben wieWie viele Objekte in Java auf Klassennamen in einem Array

List<String> runnables = null; 
runnables.add("runnable1"); 
runnables.add("runnable2"); 
runnables.add("runnable3"); 

Jede der Klassen implementiert Runnable

Also für Beispiel funktioniert dies

Thread t1 = new Thread(new runnable1()); 
t1.start(); 

was aber, wenn Sie durch eine Schleife wollen und alle von ihnen aus dem Array laufen und das Array wird zur Laufzeit dynamisch aufgebaut. Sie wissen zum Zeitpunkt des Codierens nicht, welche Klassennamen in der Liste stehen, da sie sich ändern können.

runnables.forEach((String classname) -> { 
    System.out.println("The runnable is " + (String) classname); 
    Thread t1 = new Thread(new classname()); 
    t1.start();  
}); 

Geht nicht, sagt es " nicht Symbol Symbol finden können: class classname Lage: Klasse ConncurrencyTesting " Auf der Zeile, die beginnt "Thread t1 = ...." in der forEach .

Thread t1 = new Thread(new classname()); 

Mit dieser Linie, die Reflexion verwendet eine Instanz aus dem Klassennamen zu generieren:

+0

Für die Aufzeichnung: * Reflection * ist irgendwie ein komplettes "Thema "für sich selbst. Wenn Sie wirklich nichts darüber wissen, sehe ich eine gewisse Chance, dass Sie sich überbelasten. – GhostCat

Antwort

3

Wenn die Klasse, es zu nutzen versuchen, vor geladen ist, können Sie diese Zeile ersetzen

Thread t1 = new Thread((Runnable)Class.forName(className).newInstance()); 

Der Trick ist, die Klassen müssen alle implementieren Runnable und die String Klassenname muss auch das Paketverzeichnis enthalten. (ZB statt "Triangle" würde es brauchen "shape.Triangle"

jedoch sein, wenn Sie versuchen, eine Klasse zu verwenden, die außerhalb des classpath ist, erhalten Sie eine ClassLoader verwenden müssen, um die Klasse zu laden, bevor Sie versuchen, es zu instanziieren. I Ich empfehle das nicht, da es ein höheres Level-Konzept ist und große Kopfschmerzen bereiten wird, wenn Sie nicht wissen, wie Java das Laden von Klassen handhabt.

Verwandte Themen