# Klasse dynamisch casten



## KSG9|sebastian (2. Mrz 2005)

Hi Leute,

ich hab folgendes Problem: 

Ich hab x Klassen die alle ein Interface implementieren. Ich kann die Klassen aber nicht im Code instanzieren, sondern während der Laufzeit. Ich hab aber keine Lust, alles mit Reflection zu machen, deshalb wollte ich mal fragen, ob es eine Möglichkeit gibt, ne Klasse per Class.forName("Clazz.class").newInstance() zu erzeugen, und sie dann zu Casten, z.B. in der Art:


```
String cl = "de.Test";
Test clazz = (cl)Class.forName("cl");
```

Das es so nicht geht weiß ich auch, aber gibt es da irgendne möglichkeit, von mir aus auch mit dem Tiger ?


----------



## Sky (2. Mrz 2005)

KSG9|plak hat gesagt.:
			
		

> Ich kann die Klassen aber nicht im Code instanzieren, sondern während der Laufzeit.



Was meinst Du damit??


----------



## meez (2. Mrz 2005)

Du meinst sowas:

```
Object o = Class.forName("test");
Test t = (o.getClass()) o;
```

Soviel ich weiss geht das nicht...


----------



## KSG9|sebastian (2. Mrz 2005)

Jo, genau sowas meine ich!

Ich bekomme die Klassennamen als String, aus nem XML, ner Datenbank oder sonst wo her.


----------



## Sky (2. Mrz 2005)

Mal ne Frage: Wenn deine Klassen doch alle das gleiche Interface haben, warum verwendest Du keine Factory?

Beispiel:

```
interface TestInterface {
  // dein Interface
}

class TestClass1 implements TestInterface {
  // deine 1. Klasse
}

class TestClass2 implements TestInterface {
  // deine 2. Klasse
}

class TestClass3 implements TestInterface {
  // deine 3. Klasse
}

class TestFactory {
  // Parameter und Bedingung sind natuerlich frei definierbar
  public static TestInterface createInstance(String name) {
    if ("TestClass1".equals(name)) {
      return new TestClass1();
    } else if ("TestClass2".equals(name)) {
      return new TestClass2();
    } else if ("TestClass3".equals(name)) {
      return new TestClass3();
    } else {
      throw new IllegalArgumentException();
    }
  }
}
```

EDIT: Code abgeändert

EDIT2: Geht auch noch was kürzer:
	
	
	
	





```
class TestFactory {
  // Parameter und Bedingung sind natuerlich frei definierbar
  public static TestInterface createInstance(String name) throws Exception {
    return (TestInterface)Class.forName(name).newInstance();
  }
}
```


----------



## meez (2. Mrz 2005)

Das  ganze ist eigentlich sowieso nicht brauchbar, da wenn du ja  die Klasse wissen musst, welcher du es zuordnest

```
Test t = (o.getClass()) o;
```
Test muss ja bekannt sein...Also kannst du im Code acugh gleich schreiben:

```
Test t = (Test) o;
```


----------



## Bleiglanz (2. Mrz 2005)

Class.forName("Schlumpf.class").newInstance()

erzeugt doch das gewünschte Objekt (muss natürlich ein Default-Konstruktor dasein) - dieses kannst du dann zu deinem InterfaceTyp casten

wenn nicht, nach Class.forName per Reflection den Konstruktor ermitteln und mit invoke aufrufen


```
Object o = Class.forName("test");
Test t = (o.getClass()) o;
```
das ist nonsense, forName liefert ja gar keine Objektinstanz von test und "dynamisches Casten" gibts in Java nicht


----------



## KSG9|sebastian (2. Mrz 2005)

Dast mit ner Factory hört sich gut an !


----------



## meez (2. Mrz 2005)

Bleiglanz hat gesagt.:
			
		

> ```
> Object o = Class.forName("test");
> Test t = (o.getClass()) o;
> ```
> das ist nonsense, forName liefert ja gar keine Objektinstanz von test und "dynamisches Casten" gibts in Java nicht


Klar ist das nonsense...Ging ja auch nicht um das erstellen des Objektes, sondern um das dynamische Casten...


----------



## KSG9|sebastian (2. Mrz 2005)

Wie gesagt, zu nem Interface casten hört sich gut an!


----------



## meez (2. Mrz 2005)

KSG9|plak hat gesagt.:
			
		

> Wie gesagt, zu nem Interface casten hört sich gut an!



Das Problem ist dann halt, dass du das Interface in allen Klassen implementieren musst, und somit nie alle Methoden der verscheidenen Klassen zur Verfügung hast (Ausser du brauchst eh nur  überall die gleiche Methode)...


----------



## KSG9|sebastian (2. Mrz 2005)

Ja, das Interface gibt Methoden vor die von meinem Core-System verwendet werden. Deshalb brauche ich auch nur die Methoden die vom Interface bereitgestellt werden.


----------



## Sky (2. Mrz 2005)

meez hat gesagt.:
			
		

> Das Problem ist dann halt, dass du das Interface in allen Klassen implementieren musst



Tut er doch: 





			
				KSG9|plak hat gesagt.:
			
		

> Ich hab x Klassen die alle ein Interface implementieren.



EDIT: zu spät...


----------



## meez (2. Mrz 2005)

sky80 hat gesagt.:
			
		

> meez hat gesagt.:
> 
> 
> 
> ...



Das kommt davon, wenn ich nicht alles lese....


----------



## KSG9|sebastian (2. Mrz 2005)

hehe loel 

Im groben geht es um ne Web-Anwendung, die man mit Modulen erweitern kann. Und um die Module zu "installieren" müssen sie das Interface implementieren!


----------

