Domanda

Questo è qualcosa come Reflection dove puoi chiamare un metodo semplicemente con il suo nome e non un puntatore precompilato ad esso.

Come in JavaScript puoi:

var fun = function(){    alert("Hello World!");    }
fun();

È possibile qualcosa di simile in Java / J2ME? Come?

È stato utile?

Soluzione

Se desideri un interprete per j2me, puoi dare un'occhiata a Hecl: http://www.hecl.org

Non puoi assolutamente fare la maggior parte delle cose "fantasiose" che puoi fare nella normale Java in J2ME. L'alternativa è una serie di if / elseif che poi chiamano la funzione desiderata, ma devi comunque conoscerla in anticipo in modo da poter scrivere il codice che lo fa.

Altri suggerimenti

Un modo per imitare questa funzionalità è creare una classe di strategia.

interface Function
{
    Object call(Object[] arguments);
}

Per fare ciò che hai suggerito, fai semplicemente quanto segue (un po 'più dettagliato, come in genere Java):

static class Fun implements Function
{
    public Object call(Object[] arguments)
    {
        System.out.println("Hello, world");
        return null;
    }
}

Function fun = new Fun();
fun.call(null);

A seconda della situazione, potresti essere in grado di utilizzare tipi o generici migliori invece di Object e Object [] (in questo caso, li ho usati per la massima flessibilità , ma non ti danno molto in termini di controllo del tipo, quindi non è l'ideale).

Per ulteriori informazioni, guarda modello di progettazione della strategia .

Il modo comune per ottenere qualcosa di simile alle chiusure di Javascript è l'uso di classi interne anonime. È molto più dettagliato, ma ti consente di fare praticamente la stessa cosa.

Runnable r = new Runnable(){
    public void run(){
        System.out.println("Hello, world!");
    }
};
r.run(); // Prints "Hello, world!"

Puoi anche fare riferimento alle variabili nel metodo allegato, se sono definitive:

public static Runnable makeGreeter(final String who) {
    return new Runnable() {
        public void run() { 
            System.out.println("Hello, " + who + "!"); 
        }
    };
}

// ... elsewhere in your program...
Runnable r = makeGreeter("world");
r.run(); // "Hello, world!"

Questa è roba standard che è stata in Java sin dall'inizio. Runnable è un'interfaccia molto utile che, secondo Javadocs, "dovrebbe essere implementata da qualsiasi classe le cui istanze sono intese per essere eseguite da un thread". Runnable può essere usato per molto più dei thread, ovviamente, ed è generalmente usato (nella JVM e altrove) come "qualcosa che può essere eseguito" - praticamente come una funzione in Javascript. Naturalmente, se vuoi passare degli argomenti, dovresti creare la tua interfaccia, ma anche questi possono essere implementati in modo anonimo. Ad esempio, utilizzando Funzione @code di Imagist interfaccia :

interface Function {
    Object call(Object[] arguments);
}

// ...
Function helloSayer = new Function(){
    public Object call(Object[] args){
        System.out.println("Hello, " + args[0] + "!");
    }
};
helloSayer.call(new Object[]{ "world" }); // "Hello, world!"

Modifica: Questo non ha nulla a che fare con la riflessione, ovviamente, ma non c'è neanche una riflessione nel tuo esempio - solo una funzione anonima.

Stai cercando la creazione dinamica di metodi o Reflection ?

Il primo che non puoi fare in Java ma potresti usare un interprete ( BeanShell se vuoi Java).

Esistono almeno alcuni modi:

Potresti creare classi in fase di esecuzione con BCEL , ma devi creare tu stesso i bytecode. E il verificatore della JVM potrebbe rifiutare la tua classe se i tuoi bytecode sembrano incerti. Non è una soluzione semplicissima ma fattibile.

L'implementazione Java 6 di Sun include Rhino , l'interprete JavaScript, quindi puoi forse fare ciò di cui hai bisogno se sei disposto a usare un po 'di JavaScript.

Non ne sono troppo sicuro, ma credo che se hai JDK installato, puoi invocare javac dal tuo programma Java. L'output di javac potrebbe essere caricato in fase di esecuzione con una classe ClassLoader personalizzata.

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