رأيت جزء الوكيل من السبات في اليومين الماضيين. كان رد الفعل الأول هو أن الطبقة الكامنة تستخدم الانعكاس وإنشاء فئة وكيل لكيان المستخدم. في وقت لاحق ، أدركت أن الانعكاس لم يكن لديه أي قدرة على إنشاء فصول جديدة ، لذلك وجدت بشكل طبيعي javassist (عنوان التنزيل).
يتم شرح معظم البرامج التعليمية التي تم البحث فيها عبر الإنترنت إلى Javassist API ، ولكن في النهاية ، لا توجد عملية تحميل غالبًا. عندما يقوم المؤلف بتقليد هذه البرامج التعليمية لتحميل الفصل ، فإن النتائج التي تم تحميلها هي الفئة الأصلية ولا يوجد محتوى مع تعديل رمز Bytecode.
بعد بعض الاستكشاف ، وجد المؤلف أن الخطوة الأخيرة في معظم البرامج التعليمية على الإنترنت ، يتم استخدام الرمز BYTECODE لتوفير رمز BYTECODE. بعد التحقق من بنية الوظيفة الخاصة به ، وجد أنه يحتوي أيضًا على تحميل من نوع السلسلة. لأنه تحت Eclipse ، فإن الموضع الجذر لرمز Bytecode ليس ".//" ولكن ".//bin" ، ومن المرجح أن يكون الحمل الزائد من الكتابة هو المعلمة التي تحدد الموضع الجذر للرمز البريطاني. بعد بعض التغييرات ، وجدت أنه كان صحيحا.
ما يلي هو الرمز التجريبي:
هذا هو بنية مشروع المؤلف:
editable.java: package com.thrblock.javassist ؛ الفئة العامة قابلة للتحرير {public void showInfo () {system.out.println ("infodefault!") ؛ }} main.java: package com.throblock.javassist ؛ استيراد java.io.ioException ؛ استيراد javassist.cannotcompilexception ؛ استيراد javassist.classpool ؛ args) {classpool pool = classpool.getDefault () ؛ حاول {pool.insertClassPath (".// bin") ؛ // تعيين مسار الجذر. (من الواضح أن مسار الجذر الذي تم تعيينه هنا غير مستخدم بواسطة WriteFile) ctclass cc = pool.makeClass ("com.throlock.javassist.editableChanged") ؛ ctnewmethod.make ("public void showInfo () {super.showinfo () ؛ system.out.println (/" custominserthaha!/") ؛} ، cc.addmethod (cm) ؛ cc.writefile (".// bin") ؛ // هذا أكثر أهمية. نتيجة المعلمة الفارغة هي أنه لا يتم حفظه في مسار جذر Eclipse Bytecode. } catch (notfoundException | لا يمكن compilexception | ioException e) {E.PrintStackTrace () ؛} جرب {class <؟> cl = class.forname ("com.Throblock.javassist.editableChanged") ؛ ed.ShowInfo () ؛ // استدعاء الطريقة. } catch (classnotfoundException | instantiationException | alfortionAccessException e) {e.printstacktrace () ؛}}}نتيجة الطباعة:
infodefault!
Custominserthaha!
ملاحظات أخرى:
نظرًا لأننا قد أنشأنا فصلًا ، إذا كان اسم الفصل هو نفس اسم الفئة الأصلية ، فسيتم كتابة ملف الفصل الدراسي. ومع ذلك ، إذا تم تحميل الفئة بواسطة JVM قبل التعديل ، فلن يسري الجزء المعدل ويجب إعادة تشغيل JVM.
لخص
ما سبق هو كل محتوى هذه المقالة حول طريقة الاستخدام الصحيحة لـ Javassist تحت Eclipse. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!