English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Compartir la experiencia de compilación dinámica y carga de código en programación java

Resumen

Esta clase utiliza el JavaCompiler incluido en javax.tools.ToolProvider para la compilación, utiliza File de IO y Files de NIO para la creación, lectura y copia de rutas, utiliza expresiones regulares para la conversión de nombres de paquetes y directorios, solo hice una integración de tolerancia a errores, sin mucho contenido técnico, solo por conveniencia.

API del módulo

class DynamicReactor://Constructor sin parámetros 
public Class<?> dynamicCompile(String srcPath);//Ingresa una ruta de archivo de origen específica, si tiene éxito en la compilación y copia, devuelve la instancia de la clase Class correspondiente 
private String changePacketToDic(String packageName);//Convierte un nombre de paquete válido en la ruta correspondiente en el JavaClassPath (uso eclipse, por lo que necesito agregar el directorio bin, si usa otro compilador diferente, consulte la configuración del contexto de ejecución correspondiente para modificar adecuadamente) 
private String getPackage(String srcPath);//intenta obtener el nombre del paquete de una ruta de archivo Java válida 

código fuente

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
/** 
 * DynamicReactor es un módulo de compilación dinámica, responsable de compilar archivos fuente, copiarlos a la carpeta correspondiente y cargar las clases, etc. (JDK 1.7) 
 * @author 三向板砖 
 * */
public class DynamicReactor {
	JavaCompiler compiler;
	Pattern packagePattern;
	static final String regEx = "(?*(?
	public DynamicReactor() 
	  {
		compiler = ToolProvider.getSystemJavaCompiler();
		packagePattern = Pattern.compile(regEx);
	}
	/** 
   * Compilar dinámicamente el archivo fuente dado 
   * @param srcPath Ruta del archivo fuente 
   * @return Class 
   *    
   *    
   * */
	public Class<?> dynamicCompile(String srcPath) 
	  {
		;> Class<?
		//Obtener el archivo fuente en la ruta dada 
		String packName = getPackage(srcPath);
		if(packName == null) 
		    {
			System.out.println("DynamicRector: Error de carga de packageName!");
			return null;
		}
		//Llamar al compilador compiler para compilar el archivo fuente especificado 
		int res = compiler.run(null, null, null,srcPath);
		if(res != 0) 
		    {
			System.out.println("DynamicRector:Error al Compilar Fuente de Java!");
			return null;
		}
		//Obtener la ruta correspondiente al nombre del paquete, crear la ruta si no existe y sobrescribir el archivo class especificado 
		String packageDst = changePacketToDic(packName);
		File dstDir = new File(packageDst);
		if(!dstDir.exists()) 
		    {
			dstDir.mkdirs();
		}
		Path pathFrom = Paths.get(srcPath.split("\\.java")[0] + ".class");
		Path pathTo = Paths.get(packageDst,pathFrom.getFileName().toString());
		try {
			Files.move(pathFrom, pathTo, StandardCopyOption.REPLACE_EXISTING);
		}
		catch (IOException e) {
			System.out.println("DynamicRector:Falla al Mover Archivo!");
			e.printStackTrace();
		}
		try {
			result = Class.forName(packName+"."+pathFrom.getFileName().toString().split("\\.class")[0]);
		}
		catch (ClassNotFoundException e) {
			System.out.println("DynamicRector:Clase no encontrada en Final!");
		}
		return result;
	}
	//Este método convierte un nombre de paquete válido en la ruta correspondiente 
	private String changePacketToDic(String packageName) 
	  {
		String[] dirs = packageName.split("\\.");
		String res = ".\\bin";
		for (int i = 0; i < dirs.length; i++) 
		    {
			res += \\"+dirs[i];
		}
		return res;
	}
	//Este método obtiene el nombre del paquete del archivo de origen dado en la ruta 
	private String getPackage(String srcPath) 
	  {
		String result = null;
		BufferedReader br;
		try {
			br = new BufferedReader(new FileReader(srcPath));
			String data = br.readLine();
			while(data != null) 
			      {
				if(data.indexOf("package") != -1) 
				        {
					Matcher m = packagePattern.matcher(data);
					if(m.find()) 
					          {
						result = m.group();
					}
					break;
				}
				data = br.readLine();
			}
			br.close();
		}
		catch (IOException e) {
			System.out.println("DynamicRector:Error al abrir el archivo ",+srcPath);
		}
		return result;
	}
}

Resumen

Esto es todo el contenido compartido sobre la programación dinámica y la carga de código en Java en este artículo, espero que sea útil para todos. Los amigos interesados pueden continuar consultando otros temas relacionados en este sitio, y son bienvenidos a dejar comentarios si encuentran algún defecto. Gracias por el apoyo de los amigos a este sitio!

Declaración: El contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y carga espontáneamente por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha realizado un procesamiento editorial humano y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, por favor reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará