سؤال

في Java، هل من الممكن إنشاء تعريف فئة على الطاير أثناء تشغيل التطبيق، ثم قم بإنشاء كائن من هذا الفصل؟

على سبيل المثال، سيقرأ تطبيق قيد التشغيل في ملف نصي يحتوي على قائمة من أعضاء الفصل لتضمينها في الفئة الجديدة. سيحدد التطبيق بعد ذلك تعريف فئة يستند إلى قائمة الأعضاء، ثم يفسرها.

هل كانت مفيدة؟

المحلول

نعم من الممكن القيام بذلك من الناحية النظرية ملف الفصول الدراسي الخاص بك هو رمز بايت وهو في نهاية صفيف بايت! يمكنك بعد ذلك استخدام طريقة Deeleclass الطريقة (السلسلة، البايت []، int، int) للحصول على مثيل فئة يمكن استخدامها لإرساء الكائنات عبر الانعكاس.

في الممارسة العملية، يمكنك استخدام شيء مثل جليبي أو جافاسيست.

يمكنك أيضا استخدام الطريق الطويل لتوليد رمز Java في ملف، استدعاء المحول البرمجي، ثم تحميل الملف.

نصائح أخرى

يمكنك إنشاء فصول ديناميكيا باستخدام ASM.

يمكنك القيام بذلك عن طريق كتابة التعليمات البرمجية للفصول الجديدة الخاصة بك إلى ملف، ثم استدعاء برنامج التحويل البرمجي Java في هذا الملف واستخدام مجموعة من التصنيف لتحميل هذه الفئة بشكل حيوي في تطبيق التشغيل الخاص بك. أباتشي Tomcat يفعل هذا صفحات JSP؛ يتطلب الأمر من التعليمات البرمجية، مما يجعل بعض التغييرات الموجودة عليه، يلتفها في كتلة TRY / CATCH في منتصف الفصل، والذي يكتب إليه بعد ذلك إلى نظام الملفات، ويؤدي إلى ذلك، ويستخدم عددا نصيا للحصول عليه ويقضه لخدمة الطلبات.

بالتأكيد من الممكن. انظر على سبيل المثال هذا مقالة - سلعة.

ربما أبسط سيكون الحل (من حيث عدم مطالبة مكتبات إضافية) استخدام جافا مترجم API. هذا يأتي مع Java 6. أنت فقط تكون قادرا فقط على توليد .java، وتجميعها ثم قم بتنفيذ Class.Forname ().

ربما أكثر من المبالغة، أباش بيل (مكتبة هندسة رمز البايت) يمكن استخدامها لإنشاء class الملفات أثناء وقت التشغيل.

على الرغم من أنني لم أحاول ذلك بنفسي، إلا أنه من المتصور، يمكن للمرء إنشاء فئة وحملها وفكرته أثناء وقت التشغيل.

نعم، هذا ممكن.

يمكنك إنشاء فصول مع جاواسيست عند وقت التشغيل عن طريق تحديد جسم الفصل وجعل Javassist تجميع فئةك الجديدة.

يحتوي Javassist على مترجم مخصص يخلق ByTecode بناء على تعريف فصلك. لديها بعض الطرق المعينة للتعامل مع الأشياء، ولكنها سهلة للغاية وبديهية لاستخدام هذه المكتبة.

يستخدم Javassist على JBoss، وأعتقد أن هذا مرجع جيد :)

الشيء نفسه يمكن أن يتحقق مع بيل, ومع ذلك، فإن الأمر أصعب بكثير (ولكن بهذه الطريقة لديك المزيد من السيطرة على ما يتم إنشاؤه).

ربما يمكنك القيام بشيء من هذا القبيل مع Jruby، أو JpeThon أو Groovy إذا كان يجب عليك.

إذا كنت تشعر بشكل خاص Masochistic، فيمكنك أن تنظر بيل.

إذا كنت تريد Java و Metaprogramming، استخدم groovy.

ASM. هي أدنى مكتبة bytecode المستوى ل Java، أفترض. هذا يجعل من الصعب جدا ولكن أيضا قوية جدا. أوصي بقراءة وثائق ASM (بي دي إف) أن أفهم حقا كيف جيل bytecode في أعمال جافا. تشرح هذه الوثائق أيضا كيفية تحميل ByTecode في محمل الفئة (موضوع صلب آخر للقيام بالحق).

بعد ذلك، يمكنك استخدام أحد المكتبات ذات المستوى الأعلى، إذا كان الأمر يجعل حياتك أسهل، وفهم ما يفعلونه. بالنسبة للعديد من الحالات، مثل توليد الوكلاء، جليبي مفيد وبسيط الاستخدام. لمزيد من القوة، ذكر الكثيرون جاواسيست (لم أستخدمها - CGLIB و ASM كانت جيدة بالنسبة لي).

كان هناك سؤال حديث هنا فيما يتعلق تجميع في الذاكرة والتي يجب أن تعطيك بعض تلميحات حول ما يجب القيام به بعد أن تمكنت من إنشاء شفرة المصدر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top