Frage

Das ist so etwas wie Reflection , wo Sie eine Methode aufrufen einfach durch seinen Namen, und nicht ein vorkompilierte Zeiger auf es.

Wie in JavaScript können Sie:

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

Ist so etwas möglich in Java / J2ME? Wie?

War es hilfreich?

Lösung

Wenn Sie einen Dolmetscher für J2ME möchten, können Sie Hecl check out: http://www.hecl.org

Sie können auf jeden Fall nicht die meisten der ‚Phantasie‘ Dinge, die man in normalen Java in J2ME tun kann. Die Alternative ist eine Reihe von if / elseif ist dann, dass die gewünschte Funktion aufrufen, aber Sie immer noch, dass vor der Zeit wissen, so dass Sie den Code schreiben können, die das tut.

Andere Tipps

Eine Möglichkeit, diese Funktionalität zu imitieren ist eine Strategie-Klasse zu erstellen.

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

Zu tun, was Sie vorgeschlagen, einfach die folgenden Schritte aus (etwas ausführlicher, wie Java Regel ist):

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

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

Je nach Situation, könnte man (in diesem Fall besser Typen oder Generika anstelle von Object und Object[] nutzen kann, habe ich sie für ein Maximum an Flexibilität, aber sie nicht viel geben in der Art und Weise des Typ Prüfung so es ist nicht ideal).

Für weitere Informationen sehen Sie die Strategie-Entwurfsmuster .

Der gemeinsame Weg so etwas wie Schließungen von Javascript zu bekommen ist anonyme innere Klassen verwenden. Es ist viel ausführlicher, aber es lässt Sie so ziemlich das gleiche tun.

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

Sie können auch Variablen in der umschließenden Methode verweisen, wenn sie es endgültig:

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!"

Dies ist Standard-Sachen, die seit Beginn in Java sind. Runnable ist eine sehr praktische Schnittstelle, die gemäß dem Javadocs „sollte von jeder Klasse, deren Instanzen werden sollen, ausgeführt von einem Thread durchgeführt werden“. Runnable kann für viel mehr als Fäden verwendet werden, natürlich, und in der Regel verwendet wird (in der JVM und anderswo) als „etwas, das ausgeführt werden kann“ - so ziemlich wie eine Funktion in Javascript. Natürlich, wenn Sie Argumente übergeben möchten, würden Sie Ihre eigene Schnittstelle machen müssen, aber diese können anonym als auch umgesetzt werden. Zum Beispiel mit @ Imagist der Function Schnittstelle :

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!"

Edit:. Das hat nichts mit Reflexion zu tun, natürlich, aber es gibt keine Reflexion in Ihrem Beispiel entweder - nur eine anonyme Funktion

Sind Sie nach der dynamischen Erstellung von Methoden oder Reflection ?

Die erste kann man nicht in Java tun, aber man könnte einen Dolmetscher verwenden ( Beanshell, wenn Sie wollen Java).

Es gibt mindestens ein paar Möglichkeiten:

Sie können Klassen zur Laufzeit erstellen mit BCEL , aber Sie müssen den Bytecode selbst erstellen. Und die Prüfer JVM könnte Ihre Klasse ablehnen, wenn Ihr Bytecode iffy aussehen. Nicht eine super einfache Lösung, aber machbar.

Sun Java 6 Implementierung umfasst Rhino , der JavaScript-Interpreter, so können Sie vielleicht tun, was Sie brauchen wenn Sie bereit sind, ein wenig JavaScript zu verwenden.

Ich bin mir nicht sicher, ob dies aber ich glaube, wenn Sie das JDK installiert haben, können Sie javac von Ihrem Java-Programm aufrufen kann. javac die Ausgabe zur Laufzeit mit einer benutzerdefinierten ClassLoader Klasse geladen werden kann.

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