logo

واجهة برمجة تطبيقات انعكاس جافا

انعكاس جافا هو عملية فحص أو تعديل سلوك وقت التشغيل للفئة في وقت التشغيل .

ال java.lang.Class يوفر class العديد من الطرق التي يمكن استخدامها للحصول على بيانات التعريف وفحص وتغيير سلوك وقت تشغيل الفصل.

توفر حزم java.lang وjava.lang.reflect فئات لانعكاس Java.

حيث يتم استخدامه

تُستخدم واجهة برمجة تطبيقات Reflection بشكل أساسي في:

  • IDE (بيئة التطوير المتكاملة) مثل Eclipse وMyEclipse وNetBeans وما إلى ذلك.
  • مصحح الأخطاء
  • أدوات الاختبار الخ
هل تعرف؟
  • كم عدد الطرق التي يمكننا من خلالها الحصول على مثيل فئة Class؟
  • كيفية إنشاء أداة جافاب؟
  • كيفية إنشاء أداة appletviewer؟
  • كيفية الوصول إلى الطريقة الخاصة من خارج الفصل؟

java.lang.Class الطبقة

تؤدي فئة java.lang.Class مهمتين رئيسيتين:

طول سلسلة باش
  • يوفر طرقًا للحصول على البيانات التعريفية للفئة في وقت التشغيل.
  • يوفر أساليب لفحص وتغيير سلوك وقت التشغيل للفئة.

الطرق الشائعة الاستخدام لفئة الفصل:

طريقةوصف
1) سلسلة getName () العامةإرجاع اسم الفئة
2) فئة forName الثابتة العامة (String className) تطرح ClassNotFoundExceptionيقوم بتحميل الفصل وإرجاع مرجع فئة الفصل.
3) الكائن العام newInstance () يلقي InstantiationException، IllegalAccessExceptionيخلق مثيل جديد.
4) الواجهة المنطقية العامة ()يتحقق مما إذا كانت واجهة.
5 ) isArray ( ) المنطقية العامة ;يتحقق مما إذا كان مصفوفة.
6) المنطق العام هو بدائي ()يتحقق مما إذا كان بدائيًا.
7) getSuperclass() للفئة العامةإرجاع مرجع فئة الطبقة الفائقة.
8) الحقل العام [] getDeclaredFields () يطرح SecurityExceptionإرجاع العدد الإجمالي لحقول هذه الفئة.
9) الطريقة العامة [] getDeclaredMethods () تطرح SecurityExceptionإرجاع العدد الإجمالي لأساليب هذه الفئة.
10) المنشئ العام [] getDeclaredConstructors () يطرح SecurityExceptionإرجاع العدد الإجمالي لمنشئي هذه الفئة.
11) الطريقة العامة getDeclaredMethod(String name,Class[] ParameterTypes) تطرح NoSuchMethodException,SecurityExceptionإرجاع مثيل فئة الطريقة.

كيفية الحصول على كائن فئة الفصل؟

هناك ثلاث طرق للحصول على مثيل فئة Class. وهم على النحو التالي:

  • طريقة forName() لفئة الفئة
  • طريقة getClass () لفئة الكائن
  • بناء جملة .class

1) طريقة forName() لفئة الفئة

  • يتم استخدامه لتحميل الفصل ديناميكيًا.
  • إرجاع مثيل فئة Class.
  • يجب استخدامه إذا كنت تعرف اسم الفئة المؤهل بالكامل. لا يمكن استخدام هذا للأنواع البدائية.

دعونا نرى المثال البسيط لطريقة forName().

اسم الملف: اختبار.java

jdbc jdbc
 class Simple{} public class Test{ public static void main(String args[]) throws Exception { Class c=Class.forName('Simple'); System.out.println(c.getName()); } } 

انتاج:

 Simple 

2) طريقة getClass () لفئة الكائن

تقوم بإرجاع مثيل فئة Class. يجب استخدامه إذا كنت تعرف النوع. علاوة على ذلك، يمكن استخدامه مع البدائيين.

اسم الملف: اختبار.java

 class Simple{} class Test{ void printName(Object obj){ Class c=obj.getClass(); System.out.println(c.getName()); } public static void main(String args[]){ Simple s=new Simple(); Test t=new Test(); t.printName(s); } } 

انتاج:

Simple 

3) بناء جملة .class

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

اسم الملف: اختبار.java

سلسلة المحول حتى الآن
 class Test{ public static void main(String args[]){ Class c = boolean.class; System.out.println(c.getName()); Class c2 = Test.class; System.out.println(c2.getName()); } } 

انتاج:

 boolean Test 

تحديد كائن الفئة

يتم استخدام الطرق التالية لفئة Class لتحديد كائن الفئة:

1) الواجهة المنطقية العامة (): يحدد ما إذا كان كائن الفئة المحدد يمثل نوع الواجهة.

2) isArray () المنطقي العام: يحدد ما إذا كان كائن الفئة هذا يمثل فئة صفيف.

3) المنطقية العامة هيPrimitive(): يحدد ما إذا كان كائن الفئة المحدد يمثل نوعًا بدائيًا.

دعونا نرى المثال البسيط لواجهة برمجة تطبيقات الانعكاس لتحديد نوع الكائن.

123فيلم

اسم الملف: اختبار.java

 class Simple{} interface My{} class Test{ public static void main(String args[]){ try{ Class c=Class.forName('Simple'); System.out.println(c.isInterface()); Class c2=Class.forName('My'); System.out.println(c2.isInterface()); }catch(Exception e){System.out.println(e);} } } 

انتاج:

سلسلة قابلة للمقارنة
 false true 

إيجابيات وسلبيات التأمل

يجب دائمًا استخدام انعكاس Java بحذر. على الرغم من أن الانعكاس يوفر الكثير من المزايا، إلا أن له بعض العيوب أيضًا. دعونا نناقش المزايا أولا.

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

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

عيب آخر هو النفقات العامة في الأداء. نظرًا لأنه يتم حل الأنواع قيد الانعكاس ديناميكيًا، فلا يمكن إجراء تحسين JVM (Java Virtual Machine). ولذلك، فإن العمليات التي تقوم بها الانعكاسات عادة ما تكون بطيئة.

خاتمة

بسبب السلبيات المذكورة أعلاه، فمن المستحسن عمومًا تجنب استخدام الانعكاس. وهي ميزة متقدمة يجب استخدامها فقط من قبل المبرمجين أو المطورين الذين لديهم معرفة جيدة بأساسيات اللغة. دائما تذكر! كلما تم استخدام الانعكاس، يتم اختراق أمان التطبيق.


المواضيع التالية من دروس Reflection API

طريقة newInstance()
فهم أداة جافا
إنشاء أداة جافا
إنشاء أداة appletviewer
استدعاء الطريقة الخاصة من فئة أخرى