Ejecución de código dynamic

Al igual que el SQL dynamic, en el que una cadena se ejecuta como un SQL en tiempo de ejecución, ¿podemos ejecutar el código Java de forma dinámica? Me gusta devolver un String que es un código Java y luego ejecutarlo en tiempo de ejecución. es posible?

Para código Java real, esto es posible usando la interfaz JavaCompiler . Sin embargo, es muy incómodo de usar, ya que es solo una interfaz para un comstackdor real de Java que espera comstackr definiciones de clases completas encontradas en los archivos.

La forma más fácil de ejecutar el código suministrado en tiempo de ejecución sería usar el motor de JavaScript de Rhino .

Ambas opciones han sido solo en Java 6, aunque creo que la interfaz de scripting existía anteriormente, por lo que podría usar Rhino en un JRE anterior si lo descarga y lo agrega a la ruta de clase.

Javassist

Debería utilizar una biblioteca de manipulación de códigos de bytes , como Javassist ( Wikipedia ), para ejecutar una cadena arbitraria que se proporciona en tiempo de ejecución. Javassist le permite crear un CtClass basado en una cadena que representa el código fuente; y puede convertir esto en un objeto de Class comstackdo a través de un cargador de clases en particular, de modo que la clase esté disponible para su aplicación. Otras bibliotecas necesitarían hacer algo similar a estos dos pasos para lograr lo mismo.

Entonces es posible, pero es muy pesado y es probable que haga que su aplicación sea muy difícil de razonar. Si es posible, considere diseñar una clase muy flexible de forma estática y que acepte parámetros que controlen su comportamiento.

Si desea hacer algo más que invocar dinámicamente un método existente, puede que necesite comstackr su String en bytecode. Una forma fácil de hacerlo es incluir el comstackdor Eclipse / JDT en su classpath, y luego puede usarlo para comstackr su String en una clase, que luego puede cargarse.

Este tipo de generación y ejecución de código dynamic se usa para convertir archivos JSP en servlets y se usa en otros paquetes como JasperReports para convertir una especificación de informe en una clase que luego se invoca.

Recuerde que al igual que con SQL, debe tener cuidado para evitar problemas de seguridad de inyección de código si alguno de los String contiene datos especificados por el usuario.

También puede consultar el soporte de scripting de Java 6: http://download.oracle.com/javase/6/docs/technotes/guides/scripting/programmer_guide/index.htm

Aquí hay una versión de hello world que crea una matriz de cadenas e imprime una primera:

 import javax.script.*; public class EvalScript { public static void main(String[] args) throws Exception { ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); engine.eval("var a=java.lang.reflect.Array.newInstance(java.lang.String, 1);a[0]='Hello World';print(a[0])"); } } 

Sí, es posible. Mire la API del comstackdor de Java. Echa un vistazo aquí:

http://download.oracle.com/javase/6/docs/api/javax/tools/JavaCompiler.html

Eche un vistazo a Beanshell . Proporciona un intérprete con syntax similar a Java.

Sí usando la reflexión: tutorial

Y otro tutorial aquí de IBM