Question

Ceci est quelque chose comme Reflection où vous pouvez appeler une méthode simplement par son nom, et non par un pointeur précompilé.

Comme en JavaScript, vous pouvez:

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

Est-ce possible en Java / J2ME? Comment?

Était-ce utile?

La solution

Si vous voulez un interprète pour j2me, vous pouvez consulter Hecl: http://www.hecl.org

Vous ne pouvez certainement pas faire la plupart des choses "fantaisistes" que vous pouvez faire avec Java normal dans J2ME. L’alternative consiste en une série de if / elseif appelant la fonction souhaitée, mais vous devez tout de même le savoir à l’avance pour pouvoir écrire le code qui le permet.

Autres conseils

Un moyen d'imiter cette fonctionnalité consiste à créer une classe de stratégie.

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

Pour faire ce que vous avez suggéré, procédez simplement comme suit (un peu plus détaillé, comme Java le est généralement):

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

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

En fonction de la situation, vous pourrez peut-être utiliser de meilleurs types ou génériques au lieu de Object et Object [] (dans ce cas, je les ai utilisés pour une flexibilité maximale.) , mais ils ne vous donnent pas beaucoup en termes de vérification de type, donc ce n’est pas idéal).

Pour plus d'informations, consultez le modèle de conception de stratégie .

La manière habituelle d'obtenir quelque chose comme les fermetures Javascript consiste à utiliser des classes internes anonymes. C'est beaucoup plus verbeux, mais cela vous permet de faire à peu près la même chose.

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

Vous pouvez même référencer des variables dans la méthode englobante, si elles sont finales:

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

Il s’agit d’un élément standard utilisé depuis le début en Java. Runnable est une interface très pratique qui, selon les Javadocs, "devrait être implémentée par toute classe dont les instances sont destinées à être exécutées par un thread". Runnable peut bien sûr être utilisé pour beaucoup plus que des threads et est généralement utilisé (dans la JVM et ailleurs) en tant que "quelque chose qui peut être exécuté" - à peu près comme une fonction en Javascript. Bien sûr, si vous voulez passer des arguments, vous devez créer votre propre interface, mais ceux-ci peuvent également être implémentés de manière anonyme. Par exemple, en utilisant @ d'Imagist code> interface :

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

Modifier: Cela n'a évidemment rien à voir avec la réflexion, mais votre exemple ne reflète pas non plus - il s'agit simplement d'une fonction anonyme.

Êtes-vous après la création dynamique de méthodes ou de Reflection ?

La première chose que vous ne pouvez pas faire en Java, mais vous pouvez utiliser un interpréteur ( BeanShell si vous le souhaitez. Java).

Il y a au moins plusieurs moyens:

Vous pouvez créer des classes au moment de l'exécution avec BCEL , mais vous devez créer les bytecodes vous-même. Et le vérificateur de la machine virtuelle Java peut rejeter votre classe si vos bytecodes semblent incertain. Pas une solution super facile mais faisable.

L'implémentation Java 6 de Sun inclut Rhino , l'interpréteur JavaScript, pour que vous puissiez faire ce dont vous avez besoin. si vous êtes prêt à utiliser un peu de JavaScript.

Je n'en suis pas trop sûr, mais je pense que si vous avez installé le JDK, vous pouvez appeler javac à partir de votre programme Java. La sortie de javac peut être chargée à l'exécution avec une classe ClassLoader personnalisée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top