Como declarar uma função durante a execução do programa?
-
05-07-2019 - |
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?
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
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.