# dynamische Objekte erzeugen?



## dienstag (17. Apr 2007)

Hi,

ist es in Java möglich dynamische Objekte zu erzeugen und denen dynmaische viele attribute zuzuordnen?
Also ein ansatz könnte sein ein Interface zu schreiben und den Objekten die dieses Interface implementieren beliebig viele attribute zuzuordnen. Ist das eine Möglichkeit oder bin ich auf dem Holzweg?
Ist mein Vorhaben realisierbar mit Java Bordmitteln oder muß man dafür JGroovy oder ähnliches verwenden?
Ich habe vor kurzem ne sehr ähnliche Frage gestellt, aber ich möchte halt wissen ob der Ansatz mit dem Interface ne Schnapsidee ist oder nicht.

danke


_Dieser Beitrag wurde am 17.04.2007 um 15:02 von L-ectron-X editiert.
Titel angepasst! Ex-Titel: "ich schon wieder"

BTW: Ist es eigentlich schwer, einen bescheuerten Titel zu wählen, der nichts über das Thema aussagt?_


----------



## thomator (17. Apr 2007)

Wenn Du dynamisch Objekte mit beliebig vielen Eigenschaften erstellen willst bringt Dich ein Interface nicht weiter. Da hilft nur Reflection oder eine Collection, in der die Attribute gepflegt werden.
Sollen die Attribute das einzige dynamische an den Objekten sein?


----------



## dienstag (17. Apr 2007)

-die objekte sollen alle das attribut name besitzen
-nur die attribute solllen dynamisch sein
- die attribute mittels einer collection nachzubilden scheidet aus
- es ist möglich per Reflection attributen werte zuzuordnen, wenn es dafür die entsprechenden konstruktoren gibt.

Beispielweise:


```
class Test
{
   public Test(String eins){..}
   public Test(String eins, String zwei){..}
   public Test(String eins,String zwei,String drei){..}

}
```

So in dem Fall kann ich per Reflection die Klasse Test erzeugen und sie mit 1..3 attributen belegen. Das bringt mir aber nix. Was ich will ist ein Objekt dieser Klasse zu erzeugen mit beliebig vielen attributen...daher bräuchte ich  1..n konstruktoren mit 1..n parametern.


Anders herum gefragt es ist in Java mit -bordmitteln nicht möglich eine neues Object zu erzeugen und ihm attribute zuzuornden?: 

Pseudocode:

Object obj=new Object();
obj.setAttribute(TypeString,"name");
obj.setAttribute(Type.Int,"alter");

etc...

Sowas ist in Java nicht direklt möglich?! nur mit hilfe von groovy?


----------



## thomator (17. Apr 2007)

Warum machst Du nicht eine Klasse Test mit dem Übergabeparameter String[][] für den Konstruktor?
Dann kannst Du die Werte, die Du übergibst auch noch anhand eines Spezifikators bestimmten Attributen zuweisen. Die Menge der Attribute wird doch wohl begrenzt sein, oder? Sonst läßt sich so ein Objekt doch nicht sinnvoll verarbeiten...


----------



## dienstag (17. Apr 2007)

dass war nur ein beispiel.
-die attribute können verschiedene typen annehmen
- man soll später auf jedes dieser attribute mittels reflection zugreifen /manipulieren können
-die menge der attribute ist unbestimmt


----------



## bygones (17. Apr 2007)

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Field.html

damit sollte schon einiges machbar sein.

aber ins blaue geraten ... ich bin immer seeeeehr skeptisch, wenn man klasse so komplett dynamisch erzeugen will. meistens gibt es eine einfachere, logischere und bessere loesung....


----------



## thomator (17. Apr 2007)

deathbyaclown hat gesagt.:
			
		

> aber ins blaue geraten ... ich bin immer seeeeehr skeptisch, wenn man klasse so komplett dynamisch erzeugen will. meistens gibt es eine einfachere, logischere und bessere loesung....



Sehe ich auch so, das klingt nach Eierlegender Wollmilchsau, so was geht meistens in die Hose.


----------



## KSG9|sebastian (17. Apr 2007)

Das nächste mal verwendest du bitte einen sinnvollen Threadtitel


----------



## dienstag (17. Apr 2007)

danke für die antworten.

jo der threadtitel war nicht gut gewählt


----------



## sparrow (17. Apr 2007)

dienstag hat gesagt.:
			
		

> Anders herum gefragt es ist in Java mit -bordmitteln nicht möglich eine neues Object zu erzeugen und ihm attribute zuzuornden?:
> 
> Pseudocode:
> 
> ...



Klaro kann Java das.
Bau doch einfach eine Klasse welche die Methode .setAttribute(type, name) hat.
Am besten bildest du dann innerhalb der Klasse die Möglichen Types per public static Variablen ab.
Das ganze speicherst du dann innerhalb der Klasse in einer HashMap<name, content>.


Gruß
Sparrow


----------



## thomator (17. Apr 2007)

sparrow hat gesagt.:
			
		

> Bau doch einfach eine Klasse welche die Methode .setAttribute(type, name) hat.
> Am besten bildest du dann innerhalb der Klasse die Möglichen Types per public static Variablen ab.
> Das ganze speicherst du dann innerhalb der Klasse in einer HashMap<name, content>.



Das beißt sich bissi mit 



			
				dienstag hat gesagt.:
			
		

> - die attribute mittels einer collection nachzubilden scheidet aus


----------



## sparrow (17. Apr 2007)

thomator hat gesagt.:
			
		

> sparrow hat gesagt.:
> 
> 
> 
> ...



Naja, irgendwo muss er die Werte ja lassen.
Und von aussen "fühlt" es sich ja so an als wenn dort dynamisch Variablen angelegt werden.


----------



## Marcel_Handball (17. Apr 2007)

Vielleicht hilft dir dies ja weiter:


```
public class Test{
	
	public static void main(String args[]){
	  AttributKlasse eins = new AttributKlasse("eins,zwei,drei,vier,funf,sechs");
	  eins.ausgabeDerAttribute();
	}
} 


class AttributKlasse{
	String attribute[];
	
	AttributKlasse(String att){
		attribute=att.split(",");
	}
	
	void ausgabeDerAttribute(){
		for(int i=0; i<attribute.length; i++){
			System.out.println(attribute[i]+"");
		}
	}
}
```


----------



## schalentier (17. Apr 2007)

Lest doch mal, was der Threadersteller will. Er will dynamisch Properties zu Klassen hinzufuegen *und* er will auf diese spaeter per getter/setter zugreifen koennen. 

Klar, mit der Hashmap geht das vom prinzip her, aber folgendes eben nicht:

```
dynObj.setAttribute( String.class, "name" );
dynObj.setAttribute( Integer.class, "alter" );

dynObj.getName();
dynObj.setAlter( 81 );
```

Das geht zwar mit Java auch, aber das willst du nicht. Dazu muesstest du die in die JVM geladenen Klassen dynamisch manipulieren, und das willst du wirklich nicht machen... 

Wenn du sowas unbedingt brauchst, nimm eine andere Programmiersprache (zb Ruby, da geht sowas). Ansonsten machs mit der Hashmap...


----------



## sparrow (17. Apr 2007)

Und was spricht gegen:


```
dynObj.setAttribute(String.class, "name" ); 
dynObj.setAttribute(Integer.class, "alter" ); 

dynObj.getAttribute("name"); 
dynObj.setAttributeValue("alter", 81);
```


----------



## dienstag (17. Apr 2007)

was ich will ist ein dynamsches objekt erzeugen mit beliebeigen attributen. später will ich auf diese zugreifen können, mittels reflection-
hab ne lösung für das problem gefunden in c#.
habs jetzt in c# gelöst.
das soll kein seitenhieb oder sowas sein aber ich braucht ne lösung für mein problem. es wäre auch mit Jruby oder Groovy gegangen, einer Skriptsprache aber jetzt habe ich mich für C# entschieden.


DANKE sehr


----------



## dienstag (17. Apr 2007)

> BTW: Ist es eigentlich schwer, einen bescheuerten Titel zu wählen, der nichts über das Thema aussagt?[/i]



Nein ist es nicht. ich habe mich für den betreff bereits entschuldigt. bin halt wegen dem problem gestresst gewesen, habe mir überlegt ob ich das mit Java, C# oder Python löse. Wenn man mit einem Problem beschäftigt ist, übersieht man manchmal einiges..


----------

