في بعض الحالات ، نحتاج إلى إنشاء رمز Java ديناميكيًا ، وتجميعها ديناميكيًا ، ثم تنفيذ الرمز. يوفر Javaapi أدوات مقابلة (Javacompiler) لتنفيذ التجميع الديناميكي. أدناه نقدم كيفية تنفيذ التجميع الديناميكي لرمز Java من خلال Javacompiler.
1
برنامج التحويل البرمجي javacompiler = toolprovider.getSystemJavAcompiler () ؛
احصل على برنامج التحويل البرمجي Java الذي توفره JDK ، وإذا لم يتم توفير أي برنامج مترجم ، فالرئة Null ؛
2. التجميع
// احصل على Java File Management Class StandardJavaFileManager Manager = compiler.getStandardFileManager (null ، null ، null) ؛ // الحصول على كائن ملف java iterator iterable <؟ يمتد javafileObject> it = manager.getjavafileObjects (ملفات) ؛ // قم بتعيين معلمات التجميع ArrayList <string> ops = new ArrayList <String> () ؛ ops.add ("-xLint: uncheced") ؛ Javacompiler.compilationTask Task = Compiler.getTask (NULL ، MANGARD ، NULL ، OPS ، NULL ، IT) ؛ // تنفيذ TASK TASK.CALL () ؛عندما نشير إلى التعليمات البرمجية الأخرى في الرمز المصدري الذي نريد تجميعه ، نحتاج إلى تعيين مسار الرمز المرجعي إلى -classpath ، وإلا فإن التجميع سيفشل.
ثالثا. تنفيذ
// اسم الفئة المراد تحميله className = "xxx.xxx.xxx" ؛ // احصل على فئة loader classloader = xxx.class.getClassLoader () {...} ؛ // احصل على طريقة الطريقة = cls.getDeclaredMethod (methodName ، paramcls) ؛ // إنشاء كائن مثيل الفئة Obj = cls.newinstance () ؛ // method Object [] params = {...} ؛4. رمز كامل
//classutil.javaimport java.io.filewriter ؛ استيراد java.io.bufferedWriter ؛ استيراد java.io javax.tools.standardJavafileManager ؛ import org.apache.commons.logging.log ؛ import org.apache.commons.logging.logfactory ؛ public classutil {private static logger = logfactory.getlog (classutil.class) ؛ ToolProvider.getSystemJavAcompiler () ؛}/** * احصل على مسار ملف java * param file * @return */private static string getFilePath (string file) {int last1 = file.lastindexof ('/') last1> last2؟ last1: last2)+file.separatorchar ؛}/*** compile java file* param ops parameters* param files file*/private static void javac (list <string> ops ... string ... files) فارغ) ؛ Iserable <؟ يمتد javafileObject> it = manager.getjavafileObjects (files) ؛ javacompiler.compilationTask Task = compiler.getTask (null ، manager ، null ، ops ، null ، it) ؛ task.call () ؛ if (logger.isdebugenabled () {for file: file) ملف) ؛}} catch (استثناء e) {logger.error (e) ؛} أخيرًا {if (manager! = null) {try {manager.close () ؛} catch (ioException e) { writejavafile (ملف السلسلة ، مصدر السلسلة) يلقي الاستثناء {if (logger.isdebugenabled ()) {logger.debug ("اكتب رمز مصدر java إلى: BufferedWriter (new filewRiter (file)) ؛ bw.write (source) ؛ bw.flush () ؛} catch (استثناء e) {throw e ؛} أخيرًا {if (bw! = null) {bw.close () ؛ null ؛ classloader classloader = null ؛ حاول {classLoader = classutil.class.getClassLoader () ؛ cls = classloader.loadClass (name) ؛ if (logger.isdeBugenabled ()) CLS ؛}/*** ترجمة رمز و CLASS التحميل* param filepath code path* param source code java code* param clsname name* param ops parameters* @return*/public static class <؟ {writejavafile (class_path+filepath ، source) ؛ javac (ops ، class_path+filepath) ؛ return load (clsname) ؛} catch (استثناء e) {logger.error (e) */كائن ثابت عام استدعاء (الفئة <؟> cls ، سلسلة الأسلوب ، الفئة <؟> [] paramscls ، object [] params) {object result = null ؛ try {method method = cls.getDeclaredMethod (methodname ، paramscls) ؛ object obj = cls.newinstance () ؛ {logger.error (e) ؛} نتيجة الإرجاع ؛}}خامسا الاختبار
الفئة العامة classutiltest {private static final log logger = logfactory.getLog (classutiltest.class) ؛ public static void main (String args []) java.text.decimalformat ؛/n ") ؛ sb.append (" Sum {/n ") ؛ sb.append (" private final decimalformat df = new decimalformat (/"#####/") ؛/ n ") ؛ sb.append (" public calcution (map <string> data) (30*data.get (/"f1/") + 20*data.get (/"f2/") + 50*data.get (/"f3/")/100 ؛/n ") ؛ sb.append ( ArrayList <String> () ؛ ops.add ("-XLINT: UNCHEDED") ؛ // قم بتجميع الكود والإرجاع classclass <؟> cls = classutil.loadClass ("/com/test/test/sum.java" ، sb.toString () ، "com.even.test.sum" ، ops) ؛ hashmap <string ، double> () ؛ data.put ("f1" ، 10.0) ؛ data.put ("f2" ، 20.0) ؛ data.put ("f3" ، 30.0) ؛ // تنفيذ نتيجة اختبار الكائن = classutil.invoke (cls ، logger.debug (data) ؛ logger.debug ("(30*f1+20*f2+50*f3)/100 ="+result) ؛}نتائج الاختبار
16: 12: 02.860 debug com.even.tools.classutil - اكتب رمز المصدر java إلى: .../classes // com/test/test/sum.java16: 12: 03.544 debug com.even.tools.classutil - compile java file:… com.even.tools.classutil - فئة التحميل [com.even.test.sum] بقلم sun.misc.launcheruteRuteRdAppClasslassLoader@73d16e9316: 12: 03.547 debug com.eenest.classutilt - {f1 = 10.0 ، f2 = 20.0 ، f3 = 30.0} com.even.test.classutilt - (30*F1+20*F2+50*F3)/100 = 22.0لخص
ما ورد أعلاه هو كل شيء عن أمثلة تجميع Java Dynamic Code و Advent Code ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى هذا الموقع:
برمجة Java تم تجميعها بشكل ديناميكي ومشاركة التعليمات البرمجية
Java Dynamic Programming Edit Problem Problem Problem Code
شرح مفصل لتنفيذ المراجع والوكيل الديناميكي في جافا
إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!