Execução de condições lógicas dentro de strings

3 respostas
Z

Pessoal,

Imaginem a string a seguir:

String cond = “meuObjeto.getPropriedadeInteger().intValue == 1”;

Tem como eu obter o resultado dessa igualdade da string sem ter de construir um parser?

Imaginem também que meuObjeto estará disponível onde esta string for executada.

Abraço

Roberto

3 Respostas

eduveks

O que vc quer é executar um código Java dentro de uma String, right?

Java não faz isto, pode tirar o cavalinho da chuva :twisted:

Mas como para tudo existe um “mas”, existe outras alternativas, os tais scripts… existe vários, groovy, judoscript, javascript(Rhino), jruby, jphyton e finalmente o meu preferido, LuaJava…

A desvantagem de usar qualquer uma destas linguagens de script é q na String que vc quer executar não vai poder ter um código 100% Java e sim um código aceite por estas linguagens de Script…

Vou te dar um exemplo em LuaJava…

String scriptLua = "resultado = 0\n";
scriptLua += "if meuObjeto:getPropriedadeInteger().intValue == 1 then\n";
scriptLua += "resultado = 1\n";
scriptLua += "end\n";

org.keplerproject.luajava.LuaState.LuaState luaState
= org.keplerproject.luajava.LuaStateFactory.newLuaState();

luaState.openLibs();
// Envia o "meuObjeto" para o LuaJava poder usar...
luaState.pushString("meuObjeto");
luaState.pushObjectValue(meuObjeto);
luaState.setGlobal("meuObjeto");
// Se quiser executar um arquivo com o código...
luaState.LdoFile("meuObjeto.lua");
// Se o código estiver numa String como queres...
luaState.LdoString(scriptLua);

// Pega a variavel do Lua "resultado" e verifica o seu valor...
if (luaState.getLuaObject("resultado").getString().equals("1")) {
    System.out.println("O script retornou 1!!!");
}

Entendeu??? Isto é em LuaJava, como podes ver na variável scriptLua, não tem nada a ver com Java, e depois vc tem que enviar o teu objeto java para o LuaJava para ele poder utilizar, e depois recupera um objeto do LuaJava para saber o resultado do script…

Se vc quiser mesmo usar um script mais parecido com o Java então é melhor usar o Rhino q é um javascript e é muito parecido com o Java mas não é igualzinho…

:lol:

LuaJava:
http://www.keplerproject.org/luajava/

Rhino:
http://www.mozilla.org/rhino/

Z

eduveks,

Valeu. Muito obrigado. Sua resposta acabou respondendo outras questões associadas a outros requisitos do meu projeto!

Abraço.

eduveks

Só para deixar uma explicação mais detalhada… no Java não é possível fazer isto por que?..

Java não é uma linguagem interpretada, ou seja Java não interpreta linha a linha como o PHP, ASP, Python, Ruby, Lua, etc… logo não é possível no meio da execução mandar o JRE executar um comando dinâmico, o JRE executa apenas o bytecode dos .class, portanto nem o JRE sabe o que é:

meuObjeto.getPropriedadeInteger().intValue == 1

Os comandos Java, não chegam assim no JRE e sim chega como bytecode(uma cosia nada haver q só ele intende), isto para poder ser uma plataforma de alto nível, para poder ter um alto desempenho e tudo mais, é como no C/C++, Delphi, VB, Assembly, etc… não tem como vc executar um comando destas linguagens sem ser o Binário gerado pelos seus compiladores…

As linguagens interpretadas como os scripts, o que fazem é interpretar linha a linha cada vez q o código é executado, isto causa uma grande perda de desempenho como deves imaginar, mas assim o interpretador pode executar um código dinamicamente dentro de uma string chamando uma função própria pra isto que indique ao interpretador q aquela string tem um código q ele tem q executar…

Portanto o JRE não executa código Java, e ele não entende nada de Java, apenas os Bytecodes gerados pelo JavaC…

O JavaC o q faz é “traduzir” um arquivo .java para .class, para que o Java(JRE) consiga saber o que tem que ser executado… portanto a linguagem Java é apenas uma forma para os humanos conseguirem escrever bytecodes passando pelo JavaC, e ele é q faz esta ponte…

Criado 7 de fevereiro de 2007
Ultima resposta 7 de fev. de 2007
Respostas 3
Participantes 2