English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
简述
该类使用javax.tools.ToolProvider自带的JavaCompiler进行编译,使用IO的File及NIO的Files进行对应的路径创建、读取及拷贝,使用正则表达式进行包名与目录的转换,我只是将这些东西做了个容错整合,没什么技术含量,就为个方便吧。
模块API
class DynamicReactor://空参构造 public Class<?> dynamicCompile(String srcPath);//输入一个指定的源文件路径,若编译、拷贝成功则返回该类对应的Class类实例 private String changePacketToDic(String packageName);//将一个合法的包名转换为对应JavaClassPath中的路径(我是用的是eclipse 所以需要对应地增加bin这一目录,若使用其他不同编译器,请参考对应的运行上下文设置进行适当修改) private String getPackage(String srcPath);//由一个合法的java文件路径尝试获得其包名
源代码
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 هي وحدة تجميع ديناميكية، تتحمل عملية تجميع ملف المصدر، نسخه إلى مجلد المجموعات المحدد وتحميل الفئة وما إلى ذلك (JDK 1.7) * @author 三向板砖 /* */ public class DynamicReactor { JavaCompiler compiler; Pattern packagePattern; static final String regEx = "(?<=package\\s).*(?=;)"; public DynamicReactor() { compiler = ToolProvider.getSystemJavaCompiler(); packagePattern = Pattern.compile(regEx); } /** * التجميع الديناميكي للمصدر * @param srcPath مسار ملف المصدر * @return Class * <br>إذا نجحت، أرجع نموذج فئة * <br>إذا فشلت، أرجع null /* */ public Class<?> dynamicCompile(String srcPath) { Class<?> result = null; // الحصول على مسار ملف المصدر المحدد String packName = getPackage(srcPath); if(packName == null) { System.out.println("DynamicRector:خطأ في تحميل packageName!"); return null; } // تنفيذ compiler لتشغيل ملف المصدر المحدد int res = compiler.run(null, null, null, srcPath); if(res != 0) { System.out.println("DynamicRector:Compile Java Source Error!"); return null; } //获得包名对应的路径,若路径不存在则创建,若指定class文件存在则覆盖 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:Move File Fail!"); e.printStackTrace(); } try { result = Class.forName(packName+"."+pathFrom.getFileName().toString().split("\\.class")[0]); } catch (ClassNotFoundException e) { System.out.println("DynamicRector:Class Not found in Final!"); } return result; } //该方法将一个合法包名转化为对应路径 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; } //该方法从给定的路径源文件中获得包名 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 in open file "+srcPath); } return result; } }
الخلاصة
هذا هو محتوى المقال الكامل حول مشاركة التكوين التفاعلي للكود لغة Java، آمل أن يكون مفيداً لكم. يمكن للزوار المهتمين الاستمرار في الاطلاع على مواضيع أخرى ذات صلة بالموقع، وترحيب بالتعليقات على أي نقاط غير كافية. شكراً للأصدقاء على دعم هذا الموقع!
بيان: محتويات هذا المقال تم جمعها من الإنترنت، ملكية المحتويات مملوكة للمساهمين، المحتويات تم إضافتها من قبل مستخدمي الإنترنت بطرقهم الخاصة، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتويات بشكل يدوي، ولا يتحمل أي مسؤولية قانونية ذات صلة. إذا كنت قد وجدت محتوى يشتبه في حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (أثناء إرسال البريد الإلكتروني، يرجى استبدال # ب @) لإبلاغنا، وقدم الدليل على ذلك، إذا تم التحقق من ذلك، سيتم حذف المحتوى المشبوه فوراً.