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