تحميل التعليمات البرمجية المصدر الخارجي واستخدامها داخليًا (عن طريق إعادة التوفيق أو شيء من هذا القبيل)
-
22-09-2019 - |
سؤال
هل هناك طريقة في استخدام رمز المصدر المخزّن خارجيًا وتحميله في برنامج Java ، بحيث يمكن استخدامه من خلاله؟
أرغب في الحصول على برنامج يمكن تغييره دون تحرير رمز المصدر الكامل وأن هذا ممكن حتى دون تجميع هذا في كل مرة. ميزة أخرى هي أنه يمكنني تغيير أجزاء من الكود كما أريد.
بالطبع يجب أن يكون لدي واجهات بحيث يمكن إرسال البيانات إلى هذا وإعادتها إلى برنامج المصدر الثابت مرة أخرى.
وبالطبع يجب أن يكون أسرع من نظام التفسير الخالص.
فهل هناك طريقة للقيام بذلك مثل تجميع إضافي لقطع غيار الكود المصدر الخارجي هذه وبداية للبرنامج بعد الانتهاء؟
شكرا لك مقدما ، أندرياس :)
المحلول
أنت بحاجة إلى Javax.Tools API لهذا. وبالتالي ، يجب أن تكون على الأقل تثبيت JDK لجعلها تعمل (والسماح لـ IDE الخاص بك إلى ذلك بدلاً من JRE). إليك مثال انطلاق أساسي (بدون استثناء مناسب ومعالجة ترميز فقط لجعل المثال الأساسي أقل غموضًا ، سعال):
public static void main(String... args) throws Exception {
String source = "public class Test { static { System.out.println(\"test\"); } }";
File root = new File("/test");
File sourceFile = new File(root, "Test.java");
Writer writer = new FileWriter(sourceFile);
writer.write(source);
writer.close();
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
Class<?> cls = Class.forName("Test", true, classLoader);
}
هذا يجب أن يطبع test
في stdout ، كما هو الحال بواسطة المهيمنة الثابتة في رمز مصدر الاختبار. سيكون الاستخدام الإضافي أكثر سهولة إذا كانت هذه الفئات تنفذ واجهة معينة موجودة بالفعل في ClassPath. وإلا فأنت بحاجة إلى إشراك API الانعكاس للوصول واستدعاء الأساليب/الحقول.
نصائح أخرى
في Java 6 أو لاحقًا ، يمكنك الوصول إلى المترجم من خلال حزمة Javax.tools. ToolProvider.getSystemJavAcompiler () سوف تحصل على أ javax.tools.javacompiler, ، والتي يمكنك تكوينها لتجميع المصدر الخاص بك. إذا كنت تستخدم الإصدارات السابقة من Java ، فلا يزال بإمكانك الوصول إليها من خلال واجهة com.sun.tools.javac.main الداخلية ، على الرغم من أنها أقل مرونة.
Java6 لديه واجهة برمجة تطبيقات البرمجة النصية. لقد استخدمته مع JavaScript ، لكنني أعتقد أنه يمكنك جمع كود Java الخارجي أيضًا.
http://java.sun.com/developer/technicalarticles/j2se/desktop/scripting/
تحرير: هنا رابط أكثر صلة:رمز "المصدر الديناميكي" في تطبيقات Java