Pregunta

Esto es algo como Reflexión donde puede llamar a un método simplemente por su nombre, y no un puntero precompilado a él.

Al igual que en JavaScript puedes:

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

¿Es posible algo así en Java / J2ME? ¿Cómo?

¿Fue útil?

Solución

Si desea un intérprete para j2me, puede consultar Hecl: http://www.hecl.org

Definitivamente no puedes hacer la mayoría de las cosas 'extravagantes' que puedes hacer en Java normal en J2ME. La alternativa es una serie de if / elseif que luego llaman a la función que desea, pero aún debe saber eso con anticipación para poder escribir el código que hace eso.

Otros consejos

Una forma de imitar esta funcionalidad es crear una clase de estrategia.

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

Para hacer lo que sugeriste, simplemente haz lo siguiente (un poco más detallado, como suele ser 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);

Dependiendo de la situación, es posible que pueda usar mejores tipos o genéricos en lugar de Object y Object [] (en este caso, los usé para obtener la máxima flexibilidad , pero no te dan mucho en cuanto a la comprobación de tipos, por lo que no es lo ideal).

Para obtener más información, consulte el patrón de diseño de estrategia .

La forma común de obtener algo como los cierres de Javascript es mediante clases internas anónimas. Es mucho más detallado, pero te permite hacer prácticamente lo mismo.

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

Incluso puedes hacer referencia a las variables en el método adjunto, si son 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!"

Esto es algo estándar que ha estado en Java desde el principio. Runnable es una interfaz muy útil que, según los Javadocs, debería ser implementada por cualquier clase cuyas instancias estén destinadas a ser ejecutadas por un subproceso " ;. Runnable se puede usar para mucho más que hilos, por supuesto, y generalmente se usa (en la JVM y en otros lugares) como " algo que se puede ejecutar " - Bastante como una función en Javascript. Por supuesto, si desea pasar argumentos, tendrá que crear su propia interfaz, pero también se pueden implementar de forma anónima. Por ejemplo, utilizando @ de Imagist Función interfaz :

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

Editar: Esto no tiene nada que ver con la reflexión, por supuesto, pero tampoco hay un reflejo en tu ejemplo, solo una función anónima.

¿Está tras la creación dinámica de métodos o Reflexión ?

Lo primero que no puedes hacer en Java, pero puedes usar un intérprete ( BeanShell si quieres Java).

Hay al menos algunas formas:

Puede crear clases en tiempo de ejecución con BCEL , pero debe crear los códigos de bytes usted mismo. Y el verificador de la JVM podría rechazar su clase si sus códigos de bytes parecen dudosos. No es una solución muy fácil pero factible.

La implementación de Java 6 de Sun incluye Rhino , el intérprete de JavaScript, por lo que quizás puedas hacer lo que necesites Si estás dispuesto a usar un poco de JavaScript.

No estoy muy seguro de esto, pero creo que si tiene el JDK instalado, puede invocar javac desde su programa Java. La salida de javac se puede cargar en tiempo de ejecución con una clase personalizada de ClassLoader .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top