Accesso a una funzione tramite stringa memorizzata nella tabella Hash
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?
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.