مقدمة:
في الآونة الأخيرة ، تخضع الشركة لعملية لتشكيل مكونات الأعمال ، ويستخدم تطبيق التوجيه آلية انعكاس Java. منذ استخدامه ، أريد أن أدرس وتلخيصه بعناية. في الواقع ، سواء كان ذلك هو إصدار EventBus 2.x السابق ، أو التحديثية ، أو إطار شرح العرض المبكر ، فإنه يستخدم آلية انعكاس Java إلى حد أكبر أو أقل.
ما هي آلية انعكاس جافا؟
آلية انعكاس Java هي أنه في حالة الجري ، لأي فصل ، يمكنك معرفة جميع خصائص وطرق هذه الفئة ؛ بالنسبة لأي كائن ، يمكنك استدعاء أي طريقة لمكتسبها ديناميكيًا ودعوة طريقة الكائنات التي تسمى آلية انعكاس Java.
ما هي الوظائف التي توفرها آلية الانعكاس؟
فئة آلية انعكاس جافا:
java.lang.class ؛ // class java.lang.reflect.constructor ؛ // method constructor java.lang.reflect.field ؛ // فئة عضو متغير java.lang.reflect.method ؛ // class method java.lang.reflect.modifier ؛ // أذونات الوصول
تنفيذ آلية انعكاس جافا:
1.) الحصول على كائن الفصل
// الطريقة الأولى هي استخدام الكائن getClass method person = person () (ClassNotFoundException E) {E.PrintStackTrace () ؛}2.) احصل على معلومات ملخص لكائن الفصل
منطقية isprimitive = class1.isprimitive () ؛ // الحكم على ما إذا كان هذا هو النوع الأساسي boolean isarray = class1.isarray () ؛ // judt class1.Isenum () ؛ // judge ما إذا كان asanonymousclass من فئة التعداد = class1.IsanOmeOnsClass () ؛ // upp يحتوي على حزمة مسار اسم الحزمة apackage = class1.getPackage () ؛ // الحصول على سلسلة معلومات حزمة الفئة SimpleName = class1.getSimplename () ؛ // الحصول على اسم فئة int modifiers = class1.getModifiers () ؛ // الحصول على فئة الوصول إلى الفئة <؟ class1.getDeclaringclass () ؛ // فئة خارجية
3.) احصل على السمات والأساليب والمشاركات ، إلخ. من كائن الفئة
الحقل [] allfields = class1.getDeclaredFields () ؛ // الحصول على جميع سمات حقل كائن الفئة [] publicfields = class1.getFields () ؛ // الحصول على السمة العامة من كائن الفصل try {field agefield = class1.getDeClaredfield ("age") ؛ سمة من الفئة} catch (nosuchfieldException e) {E.PrintStackTrace () ؛ من فئة كائن الفئة <؟> [] interfaceClasses = class1.getInterfaces () ؛ // الحصول على جميع واجهات بني كائن الفئة <؟> [] allconstructors = class1.getDeclaredConstructors () مُنشئ <؟> constructor = class1.getDeclaredConstructor (فئة جديدة [] {string.class}) ؛ // احصل على منشئ الإعلان المحدد publicconstructor = class1.getConstructor (فئة جديدة [] {}) e.printStackTrace () ؛} التعليق التوضيحي [] التعليقات التوضيحية = class1.getAnnotations () ؛ // الحصول على جميع التعليقات التوضيحية لشروط التعليق التوضيحي لكائن الفئة = class1.getAnnotation (deprecated.class) ؛ // الحصول على التعليق التوضيحي المحدد لنوع كائن الفئة genericsuperclass = class1.getGenericsuperClass () class1.getGenericInterfaces () ؛ // احصل على مجموعة من جميع واجهات كائن الفئة 4.) توليد ديناميكي من كائنات الفصل
// الطريقة الأولى لكائن الفئة تستدعي طريقة newInstance () لإنشاء كائن OBJ = class1.newinstance () ؛ // الطريقة الثانية للكائن تحصل على كائن المنشئ المقابل ، ثم يتم إنشاء مُنشئ المُنشئ <؟ constructor.newinstance (كائن جديد [] {"lcj"}) ؛5.) وظائف الاتصال ديناميكيا
حاول {// إنشاء كائن جديد: استخدم Object Obj = class1.newinstance () ؛ // احكم على ما إذا كان الكائن عبارة عن فئة فرعية للشخص المنطقي // أولاً وقبل كل شيء ، تحتاج إلى الحصول على الطريقة المقابلة لطريقة طريقة الطريقة = class1.getDeclaredMethod ("SETAGE" ، فئة جديدة [] {int.class}) ؛ // استدعاء الوظيفة المحددة وتمرير طريقة المعلمة. invoke (OBJ ، 28) ؛ الطريقة = class1.getDeclaredMethod ("getage") ؛ نتيجة الكائن = method.invoke (obj ، فئة جديدة [] {}) ؛} catch (InstantiationException e) {E.PrintStackTrace () ؛ e.printstacktrace () ؛} 6.) الحصول على أنواع عامة من خلال آلية الانعكاس
على سبيل المثال ، الهيكل التالي
.
احصل على أنواع عامة
الشخص <string> person = شخص جديد <> () ؛ // الطريقة الأولى هي استخدام فئة GetClass Comply <؟> class1 = person.getClass () ؛ اكتب genericsuperclass = class1.getGenericSuperClass () ؛ // الحصول على typeType [] interfacetypes = class1.getGenericInterfaces () ؛ // الحصول على أنواع جميع واجهات كائن الفئة getComponentType (genericsuperClass) ؛ getComponentType (interfacetypes [0]) ؛
تنفيذ getComponentType
الفئة الخاصة <؟> getComponentType (type type) {class <؟> componentType = null ؛ if (type extoryof parameterype) {// getactualtypearguments () إرجاع مجموعة من كائنات النوع التي تمثل معلمات النوع الفعلي لهذا النوع. اكتب [] actualTyPearguments = ((parameteristype) type) .getActualTyPearguments () ؛ if (actualTyPearguments! = null && actualTyPearguments.length> 0) {componentType = (class <؟ }} آخر إذا (نوع مثيل genericarraytype) {// نوع الصفيف الذي يمثل نوع عنصر هو نوع أو نوع متغير componentType = (class <؟>) ((classarraytype) نوع). 6.) الحصول على معلومات التعليق التوضيحي من خلال آلية الانعكاس
نركز هنا على الحصول على معلومات التعليق التوضيحي للطريقة كمثال
جرب {// أولاً وقبل كل شيء ، تحتاج إلى الحصول على كائن الطريقة المقابل طريقة الطريقة هذه = class1.getDeclaredMethod ("JumptogoodsDetail" ، فئة جديدة [] {string.class ، string.class}) ؛ التعليقات التوضيحية [] التعليقات التوضيحية 1 = method.getAnnotations () ؛ // الحصول على جميع التعليقات التوضيحية لمعلومات التعليقات التوضيحية للأسلوب. التعليق التوضيحي [] [] parameterAnnotationSarray = method.getParameterAnnotations () ؛ // الحصول على جميع معلومات التعليقات التوضيحية للمعلمة <؟> [] parametertypes = method.getParameterTypes () ؛ // الحصول على جميع نوع الفئة من نوع المعلمات [] method.getReturnType () ؛ // احصل على نوع الإرجاع من المعدلات int int = method.getModiers () ؛ // الحصول على أذونات الوصول للطريقة} catch (nosuchmethodexception e) {eprintstacktrace () ؛}سيناريوهات تطبيق آلية الانعكاس:
مزايا وعيوب آلية الانعكاس:
المزايا: حكم نوع وقت التشغيل ، تحميل الفئة الديناميكية ، وانعكاس الوكيل الديناميكي.
العيوب: الأداء مشكلة. الانعكاس يعادل سلسلة من عمليات التفسير. إخطار JVM حول ما يجب القيام به ، يكون الأداء أبطأ بكثير من رمز Java المباشر.
تلخيص:
نادراً ما تستخدم آلية الانعكاس في Java في تطوير الأعمال اليومية ، ولكنها تستخدم على نطاق واسع في بناء بعض الأطر الأساسية. اليوم قمت بتلخيصها لفترة وجيزة وتعلمتها ، ولا يزال هناك الكثير من المعرفة غير المعروفة لاستخدامها لاحقًا لتكملة ذلك.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.