Pergunta

Isto é algo como Reflexão onde você pode chamar um método simplesmente pelo seu nome, e não um ponteiro pré-compilados a ele.

Como em JavaScript você pode:

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

É algo parecido possível em Java / J2ME? Como?

Foi útil?

Solução

Se você quiser um intérprete para J2ME, você poderia verificar HECL: http://www.hecl.org

Você definitivamente não pode fazer a maioria das coisas 'sofisticados que você pode fazer em Java normal em J2ME. A alternativa é uma série de if / elseif de que, em seguida, chamar a função que deseja, mas você ainda tem que saber que antes do tempo para que você possa escrever o código que faz isso.

Outras dicas

Uma maneira de imitar essa funcionalidade é criar uma classe estratégia.

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

Para fazer o que você sugeriu, basta fazer o seguinte (um pouco mais detalhado, como Java normalmente é):

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

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

Dependendo da situação, você pode ser capaz de usar melhores tipos ou genéricos em vez de Object e Object[] (neste caso, eu usei-los para a máxima flexibilidade, mas eles não dão-lhe muito na forma de verificação de tipo assim não é ideal).

Para mais informações, veja o estratégia padrão de design .

A forma mais comum de obter algo como fechamentos de JavaScript usando classes internas anônimas. É muito mais detalhado, mas ele permite que você fazer praticamente a mesma coisa.

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

Você pode até mesmo variáveis ??de referência no método juntando, se eles estão final:

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

Este é material padrão que tem sido em Java desde o início. Runnable é uma interface muito útil que, de acordo com a Javadocs, "deve ser implementada por qualquer classe cujas instâncias são destinados a ser executados por um fio". Runnable pode ser usado para muito mais do que threads, é claro, e é geralmente utilizado (na JVM e em outros lugares) como "algo que pode ser executado" - muito parecido com uma função em Javascript. Claro, se você quiser passar argumentos, você tem que fazer a sua própria interface, mas aqueles podem ser implementadas anonimamente também. Por exemplo, usando de @ Imagist interface de Function :

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:. Isto não tem nada a ver com a reflexão, é claro, mas não há nenhuma reflexão no seu exemplo - a apenas uma função anônima

Você após a criação dinâmica de métodos ou Reflexão ?

O primeiro você não pode fazer em Java, mas você poderia usar um intérprete ( BeanShell se você quiser Java).

Há pelo menos algumas maneiras:

Você pode criar classes em tempo de execução com BCEL , mas você tem que criar o bytecode mesmo. E verificador da JVM pode rejeitar a sua classe se seus bytecodes olhar duvidoso. Não uma solução fácil super, mas factível.

A implementação do Sun Java 6 inclui Rhino , o interpretador JavaScript, para que possa, talvez, fazer o que você precisa se você estiver disposto a usar um pouco de JavaScript.

Eu não estou muito certo sobre isso, mas eu acredito que se você tiver o JDK instalado, você pode invocar javac de seu programa Java. saída de javac pôde ser carregado em tempo de execução com uma classe ClassLoader personalizado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top