Domanda

Se ho i nomi delle funzioni memorizzati come stringhe in un Hashtable.
C'è un modo per accedere alle funzioni attraverso le stringhe memorizzate?

EDIT Temo che la piattaforma che sto lavorando su CLDC1.1 / MIDP2.0 non supporta Riflessione.
Qualsiasi soluzione possibile?

È stato utile?

Soluzione

Basta usare un gran lunga lista di Else-if:

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

(Anche se io in genere non mi piace tentare allineamenti verticali in fonte, penso che in casi come questo è valsa la pena.)

Memorizzazione di un funtore nella mappa è un'alternativa, bu potrebbe aumentare le dimensioni oggetto troppo per molte applicazioni MIDP.

Altri suggerimenti

Class.forName () e newInstance () dovrebbe essere lì in MIDP 1.1 e potrebbe essere utile. Dal momento che non ha il pieno di riflessione, si potrebbe creare una classe che avvolge tutte le chiamate di funzione e li invoca. Questo presuppone che conosciate tutte le chiamate di funzione di anticipo.

Avrete bisogno di riferimenti a tutti gli oggetti a meno che non si sta facendo le chiamate statiche. Kinda disordinato, ma sarebbe ottenere il lavoro fatto.

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]), ...);
   }
}

Dato un nome di funzione, è possibile utilizzare la reflection per accedere al metodo. Oltre al nome della funzione, è necessario conoscere la sua classe, e hanno (o creare attraverso la riflessione se si ha un costruttore noarg o conosci quali parametri da passare al costruttore) un'istanza (se il metodo non è statico) e si è necessario conoscere i parametri necessari per passare ad esso.

Un'altra opzione è quella di utilizzare la classe di metodo come un puntatore alla funzione. Ha il vantaggio di conoscere sua classe, e conoscendo le sue esigenze dei parametri. Essa ha lo svantaggio di non essere serializzabile.

EDIT: Non v'è alcun modo per accedere a un metodo in Java senza riflessione da solo avere il suo nome come una stringa. Se si desidera un puntatore alternativa ad un metodo, è possibile utilizzare una classe interna anonima che richiama il metodo che si desidera che implementa un'interfaccia conosciuta e passare che alla mappa. Non sarebbe appropriato come la chiave della mappa, ma potrebbe funzionare come un valore nella mappa.

Non ho provato la riflessione sul JavaME, ma su JavaSE è possibile utilizzare la reflection per chiamare in modo dinamico un metodo.

Il seguente frammento è tratto da: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

import java.lang.reflect.*;

method2 public class {       public int add (int a, int b)       {          ritorno a + b;       }

  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: Invece di utilizzare if..then..else si può decidere di passare in realtà di nuovo un numero, e utilizzare un interruttore, in quanto sarà più facile da leggere, IMO.

Ma, a prescindere, che è probabilmente l'unica opzione dato le limitazioni di JavaME.

Mi occupo di problemi simili a Hecl , un interprete che gira su J2ME. E 'sorta di dipende da quante stringhe che si desidera affrontare, ma un metodo che funziona è quello di utilizzare l'hash per cercare un numero intero, e quindi utilizzare tale in un'istruzione switch, invece della grande elenco di if / then dichiarazioni. A proposito, hai la possibilità di utilizzare il codice sorgente Hecl; è disponibile sotto la licenza Apache liberale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top