Methoden mit wechselndem Namen in Schleife aufrufen

cybermog

Aktives Mitglied
Hallo,

kann man eine Variable in einen Methodenaufruf einbauen ? Also in einer Schleife und die Methoden heissen x.xxxa, x.xxxb, x.xxxc usw. ?

Gruß
 
per Reflection z.b.
Aber meist gibts da ne bessere herangehensweise. Was genau willst du damit machen?
 
Naja, es geht um Methoden, die auf eine Datenbank zugreifen. Für jedes Land gibt es eine Tabelle und eine Methode, die per SQL auf eine Tabelle zugreift. Die Länderabkürzungen stehen in einem Array. Die Methodennamen kann ich aus dem Array ableiten. Muss ich sogar, weil das Array an anderer Stelle erweitert werden kann. Eine Schleife i<=ArraySize soll die Methoden so aufrufen: x.xxx+array,.. ibatis übrigens.
 
Hm, das hört sich ziemlich komisch an... zeig vllt mal den entsprechenden Code dazu.
Machen alle Methoden mehr oder weniger da selbe, nur die Tabelle in die geschrieben wird ändert sich?
 
Ok. es gibt für jedes Land eine spezifische SQL Abfrage. In ibatis wird jede SQL Abfrage mit einer Methode des Managers verknüpft. Die Methoden heissen x.xxDE, x.xxEN,... In einem Array stehen die Kürzel der gewünschten Länder. Jetzt möchte ich die Methoden anhand der Kürzel, die auch im Methodennamen vorhanden sind, aufrufen.
Die Methoden liefern eine einheitliche Liste zurück. Eine Variable in den SQL Code einzubauen genügt nicht. Dafür sind die Eigenheiten der einzelnen Tabellen zu unterschiedlich. Unterschiedliche Spaltennamen, etc.

Meine Frage ist ob es prinzipiell möglich ist Variablen in Methodenaufrufe einzubauen ?
 
Ja, das geht wie gesagt per Reflection.
Aber es gibt mit sicherheit eine schönere Lösung 😉 Zeig doch mal deine Methoden die du aufrufen willst und wo du die dann aufrufen willst (mit der Variablen).
 
* Unterscheidung nach DE oder EN,
* Benutzung eines Interfaces
* Instanzierung einer entsprechenden Klasse de/en und Aufruf der gemeinsam benannten Interface-Methoden (ohne de/en)...
 
hört sich für mich nach einem Designfehler an. Wieso sind diese Tabellen so extrem unterschiedlich? Gib uns erst einmal genug Infos, denn das geht sicherlich einfacher :-/.
- Was tun diese Tabellen/was sollen sie tun
- Wieso müssen Sie sich in der Struktur von land zu land unterscheiden
- Vllt zwei Beispiel-SQLs...
 
Ich würde das ungefähr so machen:

Java:
interface MeinInterface {
    void doFoo();
    // enthaelt die Methoden ohne DE oder EN
}
Java:
class DEImpl implements MeinInterface {
    void doFoo() {
        // do foo for DE
    }
    // enthaelt die spezielle Implementierungen der Methoden für DE
}
Java:
class ENImpl implements MeinInterface {
    void doFoo() {
        // do foo for EN
    }
    // enthaelt die spezielle Implementierungen der Methoden für EN
}
Java:
class MeineFactory {
    static MeinInterface create(String token) {
        if (token.equals("de")) {
            return new DEImpl();
        } else if (token.equals("en")) {
            return new ENImpl();
        }
    }
}
Java:
String[] array = new String[]{"de", "en"};
for(int i = 0; i < array.length; i ++) {
    String token = array[i];
    MeinInterface intf = MeineFactory.create(token);
    intf.doFoo();
    // hier die Methoden aufrufen, die Du brauchst, aber ohne Länderkürzel
}
 
Ich habe keinen Einfluss auf die Tabellen.

Java:
Map<String, Object> map = new HashMap<String, Object>();
	map.put("startMonth",startMonth);
	map.put("endMonth",endMonth);
	Class cls = Class.forName("com.ef.cms.statistics.downloads.DownloadsManager");
	Class param = HashMap.class;
	String[] spArray = {"At", "Bn", "Ch", "De", "Fr", "Pt" };
	Method execution;
for (int i = 0; i< spArray.length; i++) {
				execution = cls.getMethod("select"+spArray[i]+"Date",param);
				Object arg = {map};
				downloadsAllList = (List<DownloadsBean>) execution.invoke(arg);
				pageTotal = pageTotal + downloadsAllList.size();
			}

invoke erwartet ein Object. ich möchte eine HashMap<String, Object> übergeben. Wie ?
Fehler in Zeile Object arg = {map}; connot convert Map<String, Object> to Object.

Gruß
 
Zuletzt bearbeitet:
sicher dass die Fehlermeldung nicht
[c]cannot convert from Map<String,Object>[] to Object[/c]
lautet statt
[c]cannot convert from Map<String,Object> to Object[/c]
?

na ja, besonders deutlich ist das auch nicht, es weist nur ein bisschen darauf hin, dass {} was mit Arrays zu tun hat
schreibe
[c] Object arg = map;[/c]
statt
[c] Object arg = {map};[/c]
die Klammern sind dort schlecht

oder übergib einfach die map an die folgende Methode, wenn Object erwartet wird kann man so gut wie alles übergeben,
nur nicht primitive Datentypen
 

Neue Themen


Zurück
Oben