Red de conocimiento informático - Material del sitio web - Cómo utilizar maven para compilar código escrito en java8 en la plataforma java6

Cómo utilizar maven para compilar código escrito en java8 en la plataforma java6

En el proceso general de desarrollo de aplicaciones Java, los desarrolladores utilizan Java de una forma relativamente sencilla. Simplemente abra su IDE favorito, escriba el código fuente de Java y luego use las funciones proporcionadas por el IDE para ejecutar directamente el programa Java. El proceso detrás de este modelo de desarrollo es: los desarrolladores escriben archivos de código fuente Java (.java), y el IDE será responsable de llamar al compilador de Java para compilar el código fuente de Java en un código de bytes independiente de la plataforma (el código de bytes se guarda). en el disco en forma de archivos (.class). La Máquina Virtual Java (JVM) es responsable de cargar y ejecutar el código de bytes de Java. De esta manera, Java logra su objetivo de "Escribir una vez y ejecutar en cualquier lugar". Los archivos de clase Java contienen códigos de bytes que las JVM pueden utilizar en diferentes plataformas. El código de bytes de Java no solo puede existir en forma de archivos en el disco, sino que también se puede descargar a través de la red o solo puede existir en la memoria. El cargador de clases en la JVM es responsable de definir las clases Java a partir de la matriz de bytes (byte[]) que contiene el código de bytes. En algunos casos, puede ser necesario generar dinámicamente el código de bytes de Java o modificar el código de bytes de Java existente. En este momento, debe utilizar las tecnologías relacionadas que se presentarán en este artículo. Primero, introduzcamos cómo compilar dinámicamente archivos fuente Java.

Compilación dinámica de archivos fuente Java

En circunstancias normales, los desarrolladores escriben todo el código fuente Java y lo compilan correctamente antes de ejecutar el programa. Para algunas aplicaciones, el contenido del código fuente de Java sólo se puede determinar en tiempo de ejecución. En este momento, el código fuente debe compilarse dinámicamente para generar el código de bytes de Java, que luego la JVM carga y ejecuta. Un escenario típico es el sistema de evaluación en línea de muchas competiciones de algoritmos (como PKU JudgeOnline), que permite a los usuarios cargar código Java y el sistema compila, ejecuta y emite juicios en segundo plano. Al compilar dinámicamente archivos fuente de Java, el enfoque utilizado es llamar al compilador de Java directamente en el programa.

JSR 199 presenta la API del compilador de Java. Si utiliza JDK 6, puede compilar dinámicamente código Java a través de esta API. Por ejemplo, el siguiente código se utiliza para compilar dinámicamente la clase Hello World más simple. El código de esta clase Java se almacena en una cadena.

01 prueba de compilación de clase pública {

02 public static void main(String[] args) lanza una excepción {

03 String source = "clase pública principal { public static void main(String[] args) {System.out.println(\"¡Hola mundo!\");} }";

04 Compilador JavaCompiler = ToolProvider.getSystemJavaCompiler();

05 StandardJavaFileManager fileManager = compilador.getStandardFileManager(null, null, null);

06 StringSourceJavaObject sourceObject = newCompilerTest.StringSourceJavaObject("Principal", fuente);

07 Iterablelt; extiende JavaFileObjectgt; fileObjects = Arrays.asList(sourceObject);

08 tarea CompilationTask = compilador.getTask(null, fileManager, null, null, null, fileObjects);

09 resultado booleano = task.call();

10 if (resultado) {

11 System.out.println("Compilación exitosa.

");

12 }

13 }

14

15 clase estática StringSourceJavaObject extiende SimpleJavaFileObject {

16

17 contenido de cadena privado = nulo;

18 público StringSourceJavaObject(nombre de cadena, contenido de cadena) ?throwsURISyntaxException {

19 super(URI.create(" string:///" name.replace('.','/') Kind.SOURCE.extension), Kind.SOURCE);

20 this.content = content;

21 }

22

23 public CharSequence getCharContent(boolean ignoreEncodingErrors)? Lanza IOException {

24 devuelve contenido

25 }

26 }

27 }

Si no puede utilizar la API del compilador Java proporcionada por JDK 6, puede utilizar la clase de herramienta com.sun.tools en el JDK .javac.Main, pero esta clase de herramienta solo puede compilar archivos almacenados en el disco, similar a usar el comando javac directamente.

Otra herramienta disponible es el compilador proporcionado por Eclipse JDT Core. utilizado por el entorno de desarrollo de Java para admitir la ejecución y depuración de código con errores. El compilador también se puede utilizar de forma independiente. El marco de Play utiliza el compilador de JDT internamente para compilar dinámicamente el código fuente de Java. El marco de Play escaneará periódicamente los archivos de código fuente de Java. el proyecto y compilará automáticamente el código fuente de Java una vez que lo encuentre. Por lo tanto, después de modificar el código, puede ver los cambios actualizando la página.

El siguiente es un ejemplo de cómo realizar cuatro operaciones aritméticas en Java, como encontrar el valor de (3 4)*7-10. El enfoque general es analizar la expresión de la operación de entrada y simular el proceso de cálculo usted mismo. Teniendo en cuenta cuestiones como la existencia de paréntesis y la precedencia de los operadores, dicho proceso de cálculo será más complicado y propenso a errores. Otro enfoque es utilizar el soporte del lenguaje de secuencias de comandos introducido por JSR 223 para ejecutar directamente la expresión de entrada como una secuencia de comandos JavaScript o JavaFX para obtener el resultado. El siguiente código utiliza el método de generar dinámicamente código fuente Java y compilarlo, y luego cargar la clase Java para ejecutar y obtener los resultados. Este enfoque se implementa completamente utilizando Java.

01 cálculo doble estático privado (String expr) lanza CalculationException {

02 String className = "CalculatorMain"

03 String métodoName = "calcular";

04 Fuente de cadena = "clase pública " nombre de clase

05 " { público estático doble " nombre de método "() { return " expr "; } }";

06 //Omita el código relevante para compilar dinámicamente el código fuente de Java, consulte la sección anterior

07 boolean result = task.call();

08 if (resultado) {

09 ClassLoader loader = Calculator.class.getClassLoader();

10 prueba {

11 Classlt;?gt; clazz = loader.loadClass(className);

10 p>

12 Método método = clazz.getMethod(methodName, new Classlt;?gt;[] {});

13 Valor del objeto = método.invoke(null , nuevo Objeto[] {} );

14 valor de retorno (Doble);

15 } captura (Excepción e) {

16 arroja nueva excepción de cálculo ( "Error interno.");

17 }

18 } else {

19 throw new CalculationException("Expresión incorrecta. ");

20 }

21 }

El código anterior proporciona el modo básico de usar código de bytes Java generado dinámicamente, es decir, mediante la carga de clases. cargue el código de bytes, cree una instancia del objeto de clase Java y luego llame a los métodos en el objeto a través de la API de reflexión de Java

mejora del código de bytes de Java

código de bytes de Java. La mejora se refiere a modificar el código de bytes de Java para mejorar su funcionalidad. Este enfoque es equivalente a modificar el archivo binario de la aplicación. Esta implementación se puede ver en muchos marcos de Java. La mejora del código de bytes se usa generalmente junto con anotaciones en los archivos fuente de Java. Las anotaciones declaran el comportamiento y los metadatos relacionados que deben mejorarse en el código fuente de Java, y el marco completa la mejora del código de bytes de Java en tiempo de ejecución. Hay muchos escenarios de aplicación para la mejora del código de bytes, que generalmente se centran en reducir el código redundante y el blindaje. desarrolladores de los detalles de implementación subyacentes.

Las personas que han utilizado JavaBeans pueden encontrar que los métodos getter/setter que deben agregarse son muy engorrosos y difíciles de mantener. Con la mejora del código de bytes, los desarrolladores solo necesitan declarar las propiedades en el Bean, y los métodos getter/setter se pueden agregar automáticamente modificando el código de bytes. Las personas que han utilizado JPA encontrarán que se han agregado algunos campos y métodos adicionales a la clase de entidad al depurar el programa. Estos campos y métodos los agrega dinámicamente la implementación JPA en tiempo de ejecución. La mejora del código de bytes también se utiliza en algunas implementaciones de programación orientada a aspectos (AOP).