Parameterübergabe per Reflection

Xalker

Mitglied
Hallo,

Ich habe zur Zeit folgende Aufrufe:
Java:
int i = 5;
String s =  "Text";

InterfaceDatenobject = fabrik.erstelle(i)
InterfaceDatenobject = fabrik.erstelle(s)
Die Methode "erstelle" gibt es zweimal (1. mit Übergabeparameter int und 2. mit String)

Ich möchte das gerne ändern in:

Java:
int i = 5;
String s =  "Text";
Object o;
o = i;
InterfaceDatenobject = fabrik.erstelle(o);
o = s;
InterfaceDatenobject = fabrik.erstelle(o);

Da "o" vom Typ Object ist, stimmt der Typ der Übergabevariable nicht. Gibt es trotzdem eine Möglichkeit? Ich habe an so was gedacht wie "getClass().getSimpleName()", aber irgendwie kriege ich es nicht hin.

Danke.
 
Die Zeile war falsch:
Java:
// falsch
//  InterfaceDatenobject = fabrik...
// richtig
InterfaceDatenobject i1 = fabrik....

Sorry.
 
Was ist so schlimm daran, dass es die Methode "zweimal" gibt?
Du könntest auch eine Methode erstelle(Object) machen, aber dann musst Du ja in der Methode irgendwie entscheiden was passieren soll.
 
Eine Methode erstelle(Object) zu erstellen und dort je nach Typ weiterverarbeiten, wäre eine Alternative. Dann müsste ich diese Methode aber immer ändern, wenn ich neue Typen einfüge. Falls das andere aber geht , brauche ich den alten Code nicht anfassen und brauche nur eine neue Methode mit neuen Typ erstellen.
 
Naja, entweder mit instanceof:

Java:
if(x instanceof String) ...

oder eben die Klassen vergleichen:
Java:
if(x.getClass().equals(String.class))

wobei man bei primitiven Typen aufpassen muss:
Java:
Class<?> cl=x.getClass();
if(cl.getClass().equals(Integer.class) || cl.getClass().equals(Integer.TYPE))
 
Meine Idee war:

Java:
public class TestMain {
	public static void main(String[] args) {
		Integer i = 5;
		String s = "Text";
		Object o;

                o =i;
		InterfaceDatenObject do1 = ErstelleObject(o);
                o =s;
		InterfaceDatenObject do1 = ErstelleObject(o);
	}


	public InterfaceDatenobject ErstelleObject(Object o) {
		// wie ich das dynamisch mache per Reflection, bekomme ich nicht hin
		DatenObjectFabrik fabrik;  = new DatenObjectFabrik();
		return fabrik.erstelle( ???? )
	}
}

In der Fabrik sollen, aber für jeden Typ Methoden stehen. ErstelleObject() sollte nicht verändert werden bei Erweiterungen.

Falls das nicht geht, muss ich wohl eine Methode erstelle(Object o) machen und dort je nach Übergabeparameter, das erforderliche Objekt erstellen. Ist dann nicht schön gekapselt.
 
Das liesse sich nun noch durch die Verwendung von Generics verbessern, indem man beim Programmstart eine "Map<Class<?>, Class<? extends InterfaceDataObject>>" anlegt, in welcher man die jeweiligen Typen zu vorhandenen Interfaces mapped.
Java:
public InterfaceDataObject erstelle(Object o) {
  Class<? extends IntefaceDataObject> idoc = null;
  if(o == null) {
    idoc = interfaceMap.get(null);
  } else {
    idoc = interfaceMap.get(o.getClass());
  if(idoc != null) {
    // Try-Catch-Block aus purer Faulheit weggelassen ;)
    return idoc.newInstance();
  }
  return null;
}
😳 Irgendwie benötigt man Generics ja nur, weil "Class<?>" bereits generisch ist. Naja...
Auf jeden benötigen die konkreten InterfaceDataObjects nun einen erreichbaren Standard-Konstruktor.
 
Zuletzt bearbeitet von einem Moderator:
Das ist cool und klappt auch. Danke.

Kann man beim Aufruf von idoc.newInstance() auch einen Parameter vom Typ Object mitgeben. Habe mir im Moment mit einer zusätzlichen Methode setzen geholfen.

Java:
	public iDatenObject erstellen(Object o) throws InstantiationException,
			IllegalAccessException {
		Class<? extends iDatenObject> idoc = null;
		if (o == null) {
			idoc = interfaceMap.get(null);
		} else {
			idoc = interfaceMap.get(o.getClass());
			if (idoc != null) {
				iDatenObject iDO = idoc.newInstance();
				iDO.setzen(o);
				return iDO;
			}
		}
		return null;
	}
 
Per Class-Objekt kann man nur den Standard-Konstruktor einer Klasse aufrufen, für Parameterübergabe müsste man sich mit "getConstructor(Class[] parameter)" erst den passenden holen. Ich würde aber auch bei Gettern und Settern bleiben, weil die ja ohnehin nötig sein könnten um in den Objekten Daten zu setzen oder zu lesen. Die Instanzierung über einen entsprechenden Konstruktor wäre im Gegensatz dazu um einiges aufwendiger.
 

Zurück
Oben