Frage

Wenn ich Funktionsnamen als Strings in einem Hashtable gespeichert haben.
Gibt es eine Möglichkeit, die Funktionen über die gespeicherten Strings zugreifen?

EDIT Ich bin die Plattform Angst, dass ich arbeite CLDC1.1 / MIDP2.0 nicht Reflection unterstützt.
Jede Abhilfe möglich?

War es hilfreich?

Lösung

Verwenden Sie einfach eine große lange Liste von anderen-ifs:

[...]
} else if ("foo".equals(function)) {
    target. foo();
} else if ("bar".equals(function)) {
    target. bar();
[...]

(Obwohl ich im Allgemeinen nicht wie vertikale Ausrichtungen in Quelle versucht, ich denke, in Fällen wie diesem ist es wert es.)

einen Funktor in der Karte zu speichern ist eine Alternative, bu könnte Objektgröße zu viel für viele MIDP-Anwendungen zu erhöhen.

Andere Tipps

Class.forName () und newInstance () sollte es auf MIDP 1.1 und könnte nützlich sein. Da Sie nicht die volle Reflexion haben, könnten Sie eine Klasse erstellen, die alle Funktionsaufrufe und ruft sie umschließt. Dies setzt voraus, Sie alle Funktionsaufrufe im Voraus mit.

Sie werden Referenzen müssen alle Objekte, wenn Sie statische Anrufe tun. Kinda chaotisch, aber die Arbeit erledigt bekommen würde.

public Object invoke(String name, Object[] args) {
   Object f = functionMap.get(name);
   if("f1".equals(name)) {
       return ((SomeInterface1)f).someFunction1((SomeArg0) args[0]), ...);
   } else if ("f2".equals(name)) {
       return ((SomeInterface2)f).someFunction2((SomeArg0) args[0]), ...);
   }...{
   } else if ("fN".equals(name)) {
       return ((SomeInterfaceN)f).someFunctionN((SomeArg0) args[0]), ...);
   }
}

eine Funktion Namen gegeben, könnten Sie Reflektion verwenden Sie die Methode zuzugreifen. Neben dem Namen der Funktion, müssen Sie seine Klasse kennen, und (oder durch Reflexion erstellen, wenn es einen noarg Konstruktor hat oder wissen Sie, welche Parameter an den Konstruktor übergeben) eine Instanz (wenn die Methode nicht statisch ist), und Sie müssen die Parameter kennen erforderlich ist, um es zu übergeben.

Eine andere Möglichkeit ist es, die Methode Klasse als Zeiger auf die Funktion zu verwenden. Es hat den Vorteil seine Klasse zu kennen, und seine Parameter Anforderungen zu kennen. Es hat den Nachteil, nicht serialisierbar zu sein.

EDIT: Es gibt keine Möglichkeit, eine Methode in Java ohne Reflexion zugreifen, indem er nur als String seinen Namen. Wenn Sie einen alternativen Zeiger auf eine Methode mögen, können Sie eine anonyme innere Klasse verwenden, dass die Methode aufruft Du, dass Geräte eine bekannte Schnittstelle will und gehen, dass auf Ihre Karte. Das wäre nicht als Schlüssel der Karte angebracht sein, aber es würde als Wert in der Karte arbeiten.

Ich habe nicht versucht Reflexion über JavaME, aber auf JavaSE können Sie Reflektion verwenden, um dynamisch eine Methode aufrufen.

Der folgende Ausschnitt ist entnommen aus: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

import java.lang.reflect.*;

public class method2 {       public int add (int a, int b)       {          a + b zurück;       }

  public static void main(String args[])
  {
     try {
       Class cls = Class.forName("method2");
       Class partypes[] = new Class[2];
        partypes[0] = Integer.TYPE;
        partypes[1] = Integer.TYPE;
        Method meth = cls.getMethod(
          "add", partypes);
        method2 methobj = new method2();
        Object arglist[] = new Object[2];
        arglist[0] = new Integer(37);
        arglist[1] = new Integer(47);
        Object retobj 
          = meth.invoke(methobj, arglist);
        Integer retval = (Integer)retobj;
        System.out.println(retval.intValue());
     }
     catch (Throwable e) {
        System.err.println(e);
     }
  }

}

EDIT: Anstatt if..then..else Sie verwenden möchten eine Zahl tatsächlich passieren zurück, und verwenden Sie einen Schalter, da es einfacher zu lesen, IMO.

Aber egal, die wahrscheinlich die einzige Möglichkeit, die Grenzen von JavaME gegeben ist.

Ich habe mit ähnlichen Problemen in Hecl , einen Dolmetscher, dass läuft auf J2ME. Es Art hängt davon ab, wie viele Strings Sie behandeln wollen, aber ein Verfahren, dass die Arbeiten den Hash zu verwenden, sind eine ganze Zahl zu sehen, und das dann in einer switch-Anweisung zu verwenden, statt der großen Liste der if / then-Anweisungen. By the way, sind Sie begrüßen die Hecl Quellcode zu verwenden; es ist unter der liberalen Apache-Lizenz zur Verfügung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top