¿Existe una función eval() en Java?

Resuelto karthi_ms asked hace 14 años • 14 respuestas

Tengo una cadena como la siguiente:

String str = "4*5";

Ahora tengo que obtener el resultado 20usando la cadena.

Sé que en algunos otros idiomas la eval()función hará esto. ¿Cómo puedo hacer esto en Java?

karthi_ms avatar Apr 09 '10 11:04 karthi_ms
Aceptado

Puede utilizar la ScriptEngineclase y evaluarla como una cadena de Javascript.

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
Object result = engine.eval("4*5");

Puede que haya una forma mejor, pero ésta funciona.

Jeff Storey avatar Apr 09 '2010 04:04 Jeff Storey

No existe una clase o método Java estándar que haga lo que usted desea. Sus opciones incluyen:

  • Seleccione y utilice alguna biblioteca de evaluación de expresiones de terceros. Por ejemplo , JEL o cualquiera de la media docena de bibliotecas enumeradas aquí .

  • Envuelva la expresión en el código fuente de Java para una clase con un evalmétodo, envíela al compilador de Java y luego cargue la clase compilada resultante.

  • Utilice algún lenguaje de secuencias de comandos que pueda llamarse desde Java como evaluador de expresiones. Las posibilidades incluyen Javascript 1 , BeanShell, etc. Se puede llamar a una implementación de lenguaje de secuencias de comandos compatible con JSR 223 a través de la API de secuencias de comandos .

  • Escribe tu propio evaluador de expresiones desde cero.

El primer enfoque es probablemente el más sencillo. El segundo y tercer enfoque representan un riesgo potencial para la seguridad si obtiene la expresión que debe evaluar un usuario que no es de confianza. (Piense en la inyección de código).


1 - Javascript en Java SE es un objetivo en movimiento. A partir de Java 6, se incluyó una versión de la implementación Rhino Javascript de Mozilla con Java SE. En Java 8, fue reemplazado por Nashorn. En Java 11, Nashorn quedó obsoleto y finalmente se eliminó del código base principal. A partir de 2021, tanto Rhino como Nashorn se mantienen como productos separados (que no son de Oracle), y GraalVM de Oracle tiene su propia implementación de Javascript.

Stephen C avatar Apr 09 '2010 04:04 Stephen C