¿Existe una función eval() en Java?
Tengo una cadena como la siguiente:
String str = "4*5";
Ahora tengo que obtener el resultado 20
usando la cadena.
Sé que en algunos otros idiomas la eval()
función hará esto. ¿Cómo puedo hacer esto en Java?
Puede utilizar la ScriptEngine
clase 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.
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
eval
mé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.