# Object zu laufzeitobjects zu Laufzeit dynamisch erzeugen



## malandro (29. Oktober 2006)

Ist es möglich objects zu Laufzeit dynamisch erzeugen?

Also ich habe da ein class „MyClass“ und will zu Laufzeit Instanzen diese class erzeugen und der Name für die Instanz soll eine Name welche der User vorher in der Kommandozeile eingegeben hat....

Beispiel:
String input = „“;
java.io.BufferedReader instdin = new java.io.BufferedReader (new java.io.InputStreamReader(System.in));
input = instdin.readLine();

und dann will ich eine instanz von MyClass mit den inhalt von input erzeugen

also der User gibt „dogie“ ein, dann input = „dogie“ 
und ich will dann MyClass dogie = new MyClass(); 

Ich suche schon eine weile und finde nichts was mir weiter hilft, vielleicht klappst ja hier, wenn es so nicht möglich, wie kann ich zu Laufzeit Instanzen von von eine class dynamisch erzeugen
danke schon in voraus.


----------



## zeja (30. Oktober 2006)

Über Reflection z.B. kann man Instanzen dynamisch erstellen.

Du kannst den Objektnamen nicht dynamisch vergeben. Jedoch kannst du das simulieren indem du den namen als Key zusammen mit der Instanz in eine HashMap packst.


```
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;

/**
 * @author zeja
 */
public class InstanceTest {
	
	public static void main(String [] args){
		String variableName = args[0];
		HashMap<String,TestClass> instances = new HashMap<String,TestClass>();
		try {
			//Instanz ohne Parameter erstellen
			InstanceTest test = InstanceTest.class.newInstance( );
			
			//Instanz mit Parametern über den Konstruktor erstellen
			Constructor<TestClass> constr = TestClass.class.getConstructor(new Class[]{String.class});
			TestClass testWithParams = constr.newInstance(new Object[]{"Testparam"});
			
			//Mit dem Variablennamen in die Hashmap schreiben für späteren Zugriff
			instances.put(variableName, testWithParams);
		}
		catch (InstantiationException e) {
			e.printStackTrace( );
		}
		catch (IllegalAccessException e) {
			e.printStackTrace( );
		}
		catch (SecurityException e) {
			e.printStackTrace( );
		}
		catch (NoSuchMethodException e) {
			e.printStackTrace( );
		}
		catch (IllegalArgumentException e) {
			e.printStackTrace( );
		}
		catch (InvocationTargetException e) {
			e.printStackTrace( );
		}
	}
	
	//Eine Testklassen mit Parametern im Konstruktor
	class TestClass {
		
		private String param;
		
		public TestClass(String param){
			this.param = param;
		}
	}
}
```


----------



## malandro (31. Oktober 2006)

Danke, das sieht ja schon mal ganz gut aus, und habe mich eine weile damit gespielt aber bin mir nicht ganz sicher ob ich es richtig verstehe.

Ich habe die TestClass um die folgenden drei Methoden erweitert

public void PrintWhat(){
	System.out.println("numeros: " + numero);
}

public void numeroPlus(){
	this.numero++;
}

public void changeParam(String param){
	this.param = param;
}

und versuche nachzuvollziehen was da passiert...

und dann habe ich:
instances.put(variableName, testWithParams);

testWithParams.numeroPlus();
testWithParams.numeroPlus();
testWithParams.PrintWhat();

so weit gut habe ein eintrag in hashMap mit Key =   „test1“ was in variableName war, value = TestClass und param = „Testparam“

und dann wir numero = 2 weil numeroPlus(); zwei mal ausgeführt wird und bekomme mit PrintWhat 2 zurück, so weit alles ok

dann habe ich 

variableName = "neue";
testWithParams = constr.newInstance(new Object[] { "mynew" });

instances.put(variableName, testWithParams);
testWithParams.numeroPlus();
testWithParams.PrintWhat();

variableName = "neue1";
testWithParams = constr.newInstance(new Object[] { "mynew1" });
instances.put(variableName, testWithParams);
testWithParams.numeroPlus();
testWithParams.numeroPlus();
testWithParams.PrintWhat();

und so weit scheint alles gut zu laufen, ich habe 3 Einträge in meinen HashMap .

Das problem was ich jetzt habe ist, wie kann ich meine erste instanz die mit variableName = test1 und Param =  Testparam wieder ansprechen oder in diesen fall mit numeroPlus den wert in numero weiter inkrementieren?

Probiere schon zeit eine weile und komme nicht drauf 
habe als letztes mit:
variableName = "test1";
testWithParams.changeParam("Testparam");
versucht und da macht sich was aber das ist nicht wirklich das erwünschte, meistens wird der letzte param überschrieben und inkrementiert sich der gerade überschriebene und der original Testparam auch...


----------



## zeja (1. November 2006)

Mit 

```
TestClass clazz = instances.get("test1") ;
clazz.numeroPlus();
```
bekommst du den entsprechenden Eintrag zu einem Key zurück und kannst darauf dann wieder deine Operationen ausführen.

PrintWhat ist eine Methode und sollte daher mit kleinem Buchstaben beginnen.

Versuche Bitte deine Beiträge mal entsprechend mit den Tags hier zu formatieren. Es ist ansonsten enorm schwer zu lesen und eigentlich will ich mich auf das Problem konzentrieren und nicht Zeit damit verschwenden überhaupt erstmal was gelesen zu kriegen...


----------



## malandro (1. November 2006)

sorry, hast vollkommen recht mit allen und werde die Tags für zukünftige beitrage nutzen.
Jetzt klappt alles wunderbar, Danke


----------

