Descripción breve
Esta clase usa el Javacompiler incluido con javax.tools.toolprovider para la compilación, usa archivos IO y archivos NIO para la creación, lectura y copia de rutas correspondientes, y usa expresiones regulares para convertir los nombres y directorios de paquetes. Acabo de hacer una integración tolerante a fallas de estas cosas, y no tiene contenido técnico, por lo que es por conveniencia.
API del módulo
class DynamicReactor: // Parámetro vacío Construya la clase pública <?> DynamicCompile (String srcpath); // Introduzca una ruta de archivo de origen especificada, si la compilación y la copia son exitosas, devuelve la instancia de clase de clase correspondiente de la clase privada string cambiepackettodic (string packageName); // convertir un nombre de paquete legal en la ruta en la ruta correspondiente javaclasspath (estoy utilizando el eclipe); Directorio bin correspondiente.
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.standandoption; java.util.regex.matcher; import java.util.regex.pattern; import javax.tools.javacompiler; import javax.tools.toolprovider;/*** DynamicReactor Un módulo de compilación dinámica es responsable de comparar los archivos fuente, copiándolos con los paquete correspondientes y las clases de carga (JDK 1.7). */public class DynamicReactor {javacompiler compiler; patrones paquetes de paquete; static final string regex = "(? <= paquete // s).*(? =;); public dynamicreactor () {compiler = toolprovider.getSystemJavaCompiler (); paquete de paquete = patrón.compile (reeGex);}/***... dynamic dynicet el archivo ded dynamic the dynamic the dynamic the dynamic dynamic the dynamic the dynamic the dynamic the dynamic the dynamic the dynamic the dynamic the dynamic the dynamic stone stone stouts @param srcpath ruta de archivo de origen * @return class * <br> Si exitosa devuelve la instancia de clase de la clase correspondiente * <br> Si la falla devuelve null * */public class <?> DynamicCompile (String srcpath) {class <?> Result = null; // get string packageNage (srcpath); {System.out.println ("DynamicRector: Load PackageName Error!"); Return null;} // Compilador de llamada para compilar el archivo de origen especificado int res = compiler.run (null, null, null, srcpath); if (res! = 0) {system.println ("DynamicRector: compil ruta correspondiente al nombre del paquete, cree si la ruta no existe, y sobrescribe si el archivo de clase especificado existe String PackageDst = ChangePacketTodic (PackName); File DSTDIR = New File (PackageDst); if (! dstdir.exists ()) {dstdir.mkdir ();} ruta de ruta = Paths.get (srcpath.split ("//. Java") [0] + ".class"); pathTo = paths.get (paquetegedst, pathFrom.getFileName (). ToString ()); try {files.move (PathFrom, PathTO, StandardCopyOption.RepLace_Existing);} Catch (iOexception E) {System.out.println ("DynamicRector: Move File Fail!"); E.PrintStackTrace ();} try {result = class.forname (PackName+"."+PathFrom.getFileName (). ToString (). Split ("//. Class") [0]);} {System.out.println("DynamicRector:Class Not found in Final!");}return result;}//This method converts a legal package name into the corresponding path 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 fuente de ruta dado String String getPackage (String srcpath) {String result = null; bufferedreader br; intento {br = new BufferedReader (nuevo FileReader (srcpath)); string = br.readline (); while (data (data! = neo bufferedreader (nuevo filereader (srcpath)); string = br.readline (); while (data (data! = neo bufferedreader (nuevo filereader (srcpath)); string = br.readline (); while (data (data! = neo bufferedreader (new FileReader (srcpath)); string = br.readline (); while (data! {if (data.indexof ("paquete")! = -1) {matcher m = paquete de paquete "+srcpath);} return resultado;}}Resumir
Lo anterior es todo el contenido de este artículo sobre la compilación dinámica y la carga de la programación Java. Espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!