Brève description
Cette classe utilise le javacompiler inclus avec javax.tools.toolProvider pour la compilation, utilise des fichiers IO et des fichiers NIO pour la création de chemin, la lecture et la copie correspondantes, et utilise des expressions régulières pour convertir les noms et répertoires de packages. Je viens de faire une intégration tolérante aux pannes de ces choses, et elle n'a pas de contenu technique, donc c'est pour plus de commodité.
API du module
classe dynamicreactor: // paramètre vide Construct public class <?> dynamiccompile (String srcPath); // saisir un chemin de fichier source spécifié, si la compilation et la copie sont réussies, renvoyez l'instance de classe de classe correspondante de la classe Private String ChangePackettodic (String PackageName); // je convertit un nom de pack Répertoire en conséquence.
code source
Importer 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; importer java.nio.file.standardcopy java.util.regex.matcher; import java.util.regex.pattern; import javax.tools.javacompiler; import javax.tools.toolprovider; / ** * dynamicreacteur Un module de compilation dynamique est responsable de la compilation de fichiers source, de les coches des packages correspondants et des classes de chargement (JDK 1,7) * @aotor trois packages correspondants et des classes de chargement (JDK 1,7) * @aotor trois packages correspondants et des classes de chargement (JDK 1,7) * @aUror TROISE - Packages correspondants et classes de chargement (JDK 1.7) * @Auror Tree- Packages et Classes de chargement (JDK 1.7) * @Auror Tree- Packages et Classes de chargement (JDK 1.7) * * / classe publique DynamicReactor {Javacompiler Compiler; Pattern packagePattern; static final string regex = "(? <= package // s). * (? =;); public dynamicreactor () {compiler = toolprovider.getSystemJavacompiler (); packagepattern = moderne.comPile (regex);} / ** dynamique de la dynamique * @Param Srcpath Source File Path * @return Class * <br> Si le succès renvoie la classe de la classe de la classe correspondante * <br> Si l'échec renvoie Null * * / public class <?> DynamicCompile (String SrcPath) {class <?> result = null; // get String PackageName = GetPackage (srcPath); {System.out.println ("DynamicRector: Load PackageName Error!"); Return null;} // compiler compiler pour compiler le fichier source spécifié int res = compiler.run (null, null, null, srcpath); if (res! = 0) {System.out.println ("dynamicrector: complete java error!"); correspondant au nom du package, créez-le si le chemin n'existe pas et écrase si le fichier de classe spécifié existe une chaîne packagedSt = changePackettodic (packName); file dstdir = new File (packagest); if (! dstdir.exists ()) {dstdir.mkdir ();} pathfrom = Paths.get (srcpath.split ("//. Java") [0] + ".class"); path pathto = paths.get (packagedst, pathfrom.getFileName (). ToString ()); try {files {System.out.println ("DynamicRector: Move File Fail!"); E.printStackTrace ();} try {result = class.forname (packName + "." + Pathfrom.getFileName (). ToString (). Split ("//. Class") [0]);} catch (classNotfoundException de {System.out.println ("DynamicRector: classe non trouvée dans Final!");} Retour Result;} // Cette méthode convertit un nom de package juridique en Path correspondant Private String ChangePackettodic ("String PackageName) {String [] DIRS = PACKAGENAME.SPLIT (" //. "); String res =" ./bin"; pour (InT i = 0; {res + = "//" + dirs [i];} return res;} // Cette méthode obtient le nom du package à partir du fichier source de chemin donné GetPackage (String SrcPath) {String result = null; BuffereDer Br; Try {Br = Br.RuffreDaDer (New FileReader (srcpath)); string data = br.readLine (); Whered! {if (data.indexof ("package")! = -1) {Matcher m = packagePattern.matcher (data); if (m.find ()) {result = m.group ();} bris;} data = br.readline ();} br.close ();} catch (ioException e) {system.out.println ("dynamique: ioException e) "+ srcpath);} Retour Résultat;}}Résumer
Ce qui précède est tout le contenu de cet article sur la compilation dynamique et le chargement de la programmation Java. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!