English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في الأيام القليلة الماضية رأيت جزء التمثيل المباشر لـ Hibernate، أول رد فعل كان استخدام الت反射 في الأسفل، تم إنشاء فئات وسيطة للكائنات المستخدمة، لكن بعد ذلك أدركت أن الت反射 لا يمكنه إنتاج فئات جديدة، وبالتالي وجدت بسهولة Javassist (رابط التحميل).
معظم الدروس التي وجدتها عبر الإنترنت هي دروس حول API لـ Javassist، ولكن في النهاية، لا يوجد عملية تحميل، عندما قمت بمحاولة تحميل الفئات بناءً على هذه الدروس، كانت النتائج هي الفئات الأصلية، وليس هناك أي محتوى من bytecode تم تعديله.
بعد بعض البحث، اكتشف الكاتب أن معظم الدروس المتاحة على الإنترنت في الخطوة الأخيرة، حفظ ملفات bytecode، يستخدمون نسخة بدون معلمات من writeFile، وعند مراجعة هيكل الدالة وجدوا أن هناك نسخة أخرى من نوع String، وأن في Eclipse، موقع تخزين bytecode الأساسي ليس ".\\" بل ".\\bin"، وربما تكون النسخة الأخرى من writeFile هي معلمة تحديد موقع bytecode الأساسي، وبعد بعض التغييرات، تبين أن هذا صحيح.
سيتم عرض شريط الكود مشاركته:
هذا هي بنية مشروع الكاتب:
Editable.java: package com.thrblock.javassist; public class Editable {}} public void showInfo(){ System.out.println("InfoDefault!"); } }
Main.java: package com.thrblock.javassist; import java.io.IOException; import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.CtNewMethod; import javassist.NotFoundException; public class Main { public static void main(String[] args) { ClassPool pool = ClassPool.getDefault(); try{ pool.insertClassPath(".\\bin"); //تعيين المسار الجذر (المسار المحدد هنا لم يتم استخدامه من قبل writeFile) CtClass cc = pool.makeClass("com.thrblock.javassist.EditableChanged"); //تقليد نموذج الوسيط Hibernate، نقوم بإنشاء كلاس جديد cc.setSuperclass(pool.get("com.thrblock.javassist.Editable")); //تعيين الأب CtMethod cm = CtNewMethod.make("public void showInfo(){super.showInfo();System.out.println("CustomInsertHAHA!");}",cc); //إضافة طريقة، انتبه أن هذه الطريقة تغطي الطريقة في الكلاس الأب. cc.addMethod(cm); cc.writeFile(".\\bin"); //هنا يوجد أهمية كبيرة، نتائج بدون إدخال يتم حفظها في مسار الجذر للكود البايتي الخاص بـ eclipse. } catch (NotFoundException | CannotCompileException | IOException e) { e.printStackTrace(); } try{ Class<?> cl = Class.forName("com.thrblock.javassist.EditableChanged"); //تحميل فئتنا الجديدة Editableed = (Editable) cl.newInstance(); //بما أنها تستمر في الوراثة من الفئة Editable، فهذا مشابه لـ load في Hibernate. ed.showInfo(); //استدعاء الطريقة. } catch (ClassNotFoundException | InstantiationException |IllegalAccessException e) { e.printStackTrace(); } } }
نتائج الطباعة:
InfoDefault!
CustomInsertHAHA!
ملاحظات أخرى:
بما أننا قمنا بإنشاء فئة، إذا كانت اسم هذه الفئة متطابقة مع الاسم الأصلي للفئة، فإن ملف class سيتم تغطيته، ولكن إذا تم تحميل هذه الفئة مسبقًا بواسطة JVM، فإن التغييرات التي تم إجراؤها لن تكون نافذة المفعول، وسيكون من الضروري إعادة تشغيل JVM.
الخلاصة
هذا هو محتوى المقال الكامل حول كيفية استخدام Javassist بشكل صحيح تحت Eclipse، آمل أن يكون مفيدًا للجميع. يمكن للذين يهتمون بالاستمرار في مراجعة مواضيع أخرى ذات صلة على هذا الموقع، وإذا كان هناك نقص، فيرجى ترك تعليق. شكرًا لكل من يدعم هذا الموقع!
بيان: محتويات هذا المقال تم جمعها من الإنترنت، حقوق النشر مملوكة للمالك الأصلي، المحتوى تم إضافته من قبل مستخدمي الإنترنت بشكل تلقائي، لا يمتلك هذا الموقع حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل الموقع أي مسؤولية قانونية مرتبطة بذلك. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فيرجى إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # بـ @) للإبلاغ، وتقديم الدليل على ذلك، وإذا تم التحقق من ذلك، سيتم حذف المحتوى المشبوه فورًا.