English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تفسير الت反射 في Java

معلومات القراءة

  1. API للتفكير في Java
  2. يُنشأ كائن عبر الت反射
  3. استدعاء الطريقة الخاصة من خلال الت反射
  4. حول أداة javap
  5. مراجع

API للتفكير في Java

Java reflectionتشير إلى عملية الحصول على خصائص أو طرق الكائن أو تعديل سلوك الكائن أثناء التشغيل.

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

تتعلق reflection في Java بشكل رئيسي بكلاسي java.lang و java.lang.reflect.

مثال على تطبيقات الت反射

  1. IDE مثل Eclipse، MyEclipse، NetBeans، إلخ؛
  2. مكتبات التتبع;
  3. أدوات الاختبار، إلخ؛
  4. كل القواميس، مثل spring، hibernate، إلخ؛

شخصية java.lang.Class

تقدم شخصية java.lang.Class التالية功能ين رئيسيين:

  1. تقدم أساليب لزيارة المعلومات عن الفئة أثناء التشغيل
  2. تقدم أساليب用于 التحقق والتعديل من سلوك الفئة أثناء التشغيل

أساليب شخصية java.lang.Class الشائعة

أسلوب وصف
1) public String getName() يعود بالنوع الفئة
2) public static Class forName(String className)throws ClassNotFoundException تحميل الفئة وإرجاع شخصية الفئة
3) public Object newInstance()throws InstantiationException,IllegalAccessException إنشاء مثيل للشخصية
4) public boolean isInterface() تحديد ما إذا كان واجهة
5) public boolean isArray() تحديد ما إذا كان مصفوفة
6) public boolean isPrimitive() تحديد ما إذا كان نوع بيانات أساسي
7) public Class getSuperclass() يعود بنسق مرجع الفئة الأم
8) public Field[] getDeclaredFields()throws SecurityException يعود بنسق حقول الأعضاء للفئة
9) public Method[] getDeclaredMethods()throws SecurityException يعود بنسق أساليب الفئة
10) public Constructor[] getDeclaredConstructors()throws SecurityException يعود بنسق بناء الفئة
11) public Method getDeclaredMethod(String name,Class[] parameterTypes)throws NoSuchMethodException,SecurityException يعود بأسلوب معين في الفئة

كيفية الحصول على شخصية

هناك ثلاث طرق، مثلما يلي:

  1. طريقة forName() للشخصية، التحميل الديناميكي، عند تشغيل البرنامج، يبدأ في تحميل الفئة وينفذ التحقق من التحقق من الفئة
  2. طريقة getClass() للشخصية، التحميل الثابت (تم تحميله أثناء التجميع)
  3. جملة .class، التحميل الثابت (تم تحميله أثناء التجميع)

مثال على استخدام طريقة forName()

يمكن استخدامها للتحميل الديناميكي، عندما تعرف اسم الكائن الكامل، ويجب ملاحظة أن أنواع البيانات الأساسية لا تنطبق على هذه الطريقة؛

package tmp;
class Simple
{
}
public class Test
{
 public static void main(String args[]) throws ClassNotFoundException
 {
 Class<?> c = Class.forName("tmp.Simple");
 System.out.println(c.getName());
 System.out.println(c.getSimpleName());
 }
}
tmp.Simple
Simple

مثال على استخدام getClass()

الحصول على كائن Class من كائن النموذج

package tmp;
class Simple
{
}
public class Test
{
 void printName(Object obj)
 {
 }
 public static void main(String args[])
 {
 Simple s = new Simple();
 Class<? extends Object> c = s.getClass();
 System.out.println(c.getName());
 System.out.println(c.getSimpleName());
 }
}
tmp.Simple
Simple

مثال على استخدام جملة .class

يمكن تطبيقها على اسم الفئة، وكذلك على أنواع البيانات الأساسية، وهي كالتالي:

package tmp;
public class Test
{
 public static void main(String args[])
 {
 Class<Boolean> c = boolean.class;
 System.out.println(c.getName());
 Class<Test> c2 = Test.class;
 System.out.println(c2.getName());
 }
}
boolean
tmp.Test

تحديد النوع الذي يعكس كائن Class

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

1) public boolean isInterface(): هل يتطابق مع واجهة
2) public boolean isArray(): هل يتطابق مع الصفائح
3) public boolean isPrimitive(): هل يتطابق مع النوع الأساسي للبيانات

مثال على الكود:

package tmp;
class Simple
{
}
interface My
{
}
public class Test
{
 public static void main(String args[])
 {
 try
 {
 Class<?> c = Class.forName("tmp.Simple");
 System.out.println(c.isInterface());
 Class<?> c2 = Class.forName("tmp.My");
 System.out.println(c2.isInterface());
 }
 catch (Exception e)
 {
 System.out.println(e);
 }
 }
}
خطأ
صحيح

يُنشأ كائن عبر الت反射

هناك طريقتان، وهي كالتالي:

  1. يُنشأ من خلال طريقة newInstance() للفئة Class، هذا الأسلوب يمكنه فقط استدعاء الطريقة الخاصة بالبناء بدون معلمات؛
  2. يُنشأ من خلال طريقة newInstance() للفئة Constructor، هذا الأسلوب يناسب بناء الكائنات باستخدام طرق البناء المحددة بمعلمات، ويمكنه أيضًا تدمير نموذج الكائن الواحد، واستدعاء الطريقة الخاصة بالبناء الخاصة؛

لذا، عادةً ما يكون الطريقة الثانية أكثر استخدامًا من الطريقة الأولى.

مثال على استدعاء.newInstance() لـ Class

package tmp;
class Simple
{
 void message()
 {
 System.out.println("Hello Java");
 }
}
public class Test
{
 public static void main(String args[])
 {
 try
 {
 Class<?> c = Class.forName("tmp.Simple");
 Simple s = (Simple) c.newInstance();
 s.message();
 }
 catch (Exception e)
 {
 System.out.println(e);
 }
 }
}

Hello Java

مثال على استدعاء.newInstance() لـ Constructor

يُلاحظ هنا أنه يمكن الحصول على طريقة البناء المحددة بناءً على نوع المعاملات المدخلة، ويمكن أيضًا تغيير حدود الوصول إلى طريقة البناء.

package tmp;
import java.lang.reflect.Constructor;
class Simple
{
 private String msg;
 void message()
 {
 System.out.println("Hello Java," + msg);
 }
 private Simple(String s){
 this.msg = s;
 }
}
public class Test
{
 public static void main(String args[])
 {
 try
 {
 Class<?> c = Class.forName("tmp.Simple");
 Constructor<?> con = c.getDeclaredConstructor(String.class);
 con.setAccessible(true);
 Simple s = (Simple) con.newInstance("...");
 s.message();
 }
 catch (Exception e)
 {
 System.out.println(e);
 }
 }
}

Hello Java,...

استدعاء الطريقة الخاصة من خلال الت反射

من خلال الت反射، يمكننا استدعاء الطرق الخاصة للفئات الأخرى، وهو يتعلق بjava.lang.Class و java.lang.reflect.Method.

حيث يستخدم بشكل رئيسي Method.setAccessible() و invoke()، الأول يغير صلاحيات الوصول، والثاني يستدعي الطريقة.

من خلال استدعاء مثال على الطريقة الخاصة ذات الم参数:

package tmp;
import java.lang.reflect.Method;
class A
{
 private void cube(int n)
 {
 System.out.println(n * n * n);
 }
}
class Test
{
 public static void main(String args[]) throws Exception
 {
 Class<A> c = A.class;
 Object obj = c.newInstance();
 Method m = c.getDeclaredMethod("cube", new Class[]{int.class});
 m.setAccessible(true);
 m.invoke(obj, 4);
 }
}

حول أداة javap

يمكن استخدام الأمر javap لفك شيفرة ملفات مكتبات Java، وتقديم معلومات حول خصائص الحقول والطرق والمحركات في ملفات class

توجيه الاستخدام:

مثال javap java.lang.Object:

مثال javap -c Test:

كتابة فئة Test بسيطة، كما يلي:

package tmp;
class Simple
{
}
public class Test
{
 public static void main(String args[])
 {
 System.out.println("Hello");
 }
}

ادخل javap -c Test:

مراجع

أساسًا ترجمة، مع بعض التعديلات البسيطة

http://www.javatpoint.com/java-reflection

هذا هو نهاية محتويات هذا المقال، آمل أن يكون محتويات هذا المقال قد ساعدكم في تعلم أو عملكم، وآمل أيضًا أن تشجعوا دروس呐喊!

البيان: محتويات هذا المقال تم جمعها من الإنترنت، ملكية المحتويات للمالك الأصلي، تم جمع المحتويات من قبل مستخدمي الإنترنت من تلقاء نفسهم، ويستخدم هذا الموقع ليس لديه حقوق الملكية، ولا يتم تعديل المحتويات بشكل إنساني، ولا يتحمل هذا الموقع أي مسؤولية قانونية متعلقة بذلك. إذا رأيت محتوى يشتبه في انتهاك حقوق النسخ، فنرجو منك إرسال بريد إلكتروني إلى notice#oldtoolbag.com (يرجى استبدال # ب @ عند إرسال البريد الإلكتروني) للإبلاغ، وتقديم الدليل، إذا تم التحقق من صحة التهمة، فإن هذا الموقع سيقوم بإزالة المحتوى المزعوم بسرعة.

أنت قد تحب