Methode zum Erzeugen von neue Klasse ?

Status
Nicht offen für weitere Antworten.

gustav-mega

Bekanntes Mitglied
Hallo,

ich habe ein Interface und und eine static-Klasse, wo verschiedene Methoden deklariert sind, und ich möchte jetzt eine Methode schreiben, die als Argumment eine Klassenname (es soll sich um Klassen handeln, die diese Interface implementiern) bekommt, und dann eine neuen Objekt von diese Klasse erzeugt, kann jemand mir vielleicht sagen, ob das überhaupt möglich ist?

Gruß,
G.M.
 
aber das ist auch genau mein problem, da die Methode so allgemein sein soll, z.B. ich habe einen Interface:


Code:
interface Haupt
{
  void ausgabe();
}

und eine Klasse A :
Code:
class A implements Haupt
{
  void ausgabe()
  { 
    System.out.println("Das ist Klasse A");
  }
}

und eine Klasse B:
Code:
class B implements Haupt
{
  void ausgabe()
  {
    System.out.println("Das ist Klasse B");
  }
}

und jetzt soll in Klasse Methoden eine Methode deklariert werden, die dann abhängig von ihr Parameter einen Objekt von der eingegeben Klasse erzeugt:
Code:
static objektErzeugen(Haupt objektKlasse)
{
  // wie soll dann hier die Methode deklariert werden, damit einen neuen Objekt 
  //von der Klasse objektKlasse, die auch den Interface Haupt implementiert erzeugt wird?
}

Gruß,
G.M.
 
Ich könnte mir vorstellen, dass du sowas meinst (ab Java5)
Code:
static Haupt objektErzeugen (Class<Haupt> clazz)
{
  if (clazz.isInterface()){
    throw new IllegalArgumentException(class.toString());
  }
  try{
    return clazz.newInstance ();
  }catch (NoSuchMethodException nsme){
    throw new IllegalArgumentException("No constructor without params");
  }
}
(ungetestet)

PS: Aufrufen tust du es dann z.B. mit Klassenname.objektErzeugen (A.class).
Das ganze basiert auf der Reflection-API im Paket java.lang.reflect und den Generics in Java 1.5.

Edit: Erster 😀 (Aber Benis sieht so kompliziert aus... ist meins falsch?)
Edit2: Cool, Class#newInstance gibts ja auch noch 😉
 
mjm - methode objektErzeugen hat ja keine ahnung welche konkrete Klasse sie erzeugen soll... du könntest natürlich auch irgendwelche Flags mitgeben anhand derer die Klasse dann ein konkretes Objekt erzeugt (falls du nicht 1.5 und Reflections nehmen willst)...
 
Oder so (ebenfalls Java 5)

Code:
	public static <H extends Haupt> H objectErzeugen( H original ){
		try{
			Class<H> clazz = (Class<H>)original.getClass();
			return clazz.newInstance();
		}
		catch( InstantiationException e ){
			return null;
		}
		catch( IllegalAccessException e ){
			return null;
		}
	}
 
Hui 😳 , ich verstehe leider nur Bahnhof, und ich habe auch auf meinem Rechner JDK1.3 installiert, aber hört sich interessant an, dann werde erstmal rumgoogeln und darüber nachlesen. Aber trotzdem Vielen Dank 😀 .

Gruß,
G.M.
 
es geht auch folgendes (um Illuvatars beispiel ein wenig umzuwandeln):
Code:
static Haupt erzeugeObject(Class c) {
 if(c == A.class) {
  return new A();
 }
 else if(c == B.class) {
  return new B();
 }
 else {
   throw new IllegalArgumentException("Gegebene Klasse konnte nicht identifiziert werden !");
 }
}
das geht auch ohne JAva5[/code]
 
Illuvatar hat gesagt.:
Das is aber net mehr allgemeingültig und macht das Interface eigentlich unsinnig 😛
naja - es beschränkt das Ganze in der Hinsicht, dass man für jede neue Klasse eine neue abfrage erstellen muss. Aber in keiner Weise macht es das Interface unsinnig !!!!
 
Hi,

versuchs mal so:

Code:
public Object getObject(String s){
  Class c=Class.forName(s);
  return c.newInstance();
}

Gruß Jaraz
 
Hallo,

ich habe ein Interface und und eine static-Klasse, wo verschiedene Methoden deklariert sind, und ich möchte jetzt eine Methode schreiben, die als Argumment eine Klassenname (es soll sich um Klassen handeln, die diese Interface implementiern) bekommt, und dann eine neuen Objekt von diese Klasse erzeugt, kann jemand mir vielleicht sagen, ob das überhaupt möglich ist?

Gruß,
G.M.
Also ich weiß nicht, ob ich richtig verstanden habe was du willst bzw. meinst aber wenn du ein Objekt erzeugen willst dann mach es doch so:



Code:
static objektErzeugen(String objektKlasse) 
{ 

    	Class clazz = Class.forName(objektKlasse); //Hier wird die Klasse geladen
	Haupt obj = (Haupt) clazz.newInstance();  //Hier wird das Objekt erzeugt
                obj.ausgabe(); //Hier wird die Methode Ausgabe aufgerufen
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben