English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
في هذا الدرس، سنتعلم التفكير التلقائي، وهو ميزة في برمجة Java تسمح لنا بفحص وتعديل الفئات والطرق وما إلى ذلك.
في Java، يسمح التفكير التلقائي لنا بفحص وتعديل الفئات والواجهات والمحركات والطرق والمجالات عند تشغيل البرنامج.
قبل تعلم التفكير التلقائي في Java، يجب أن نفهم فئة Java المسمى Class.
يوجد في Java فئة تُدعى Class، وتحتفظ هذه الفئة بمعلومات كاملة عن الكائنات والفئات عند تشغيل البرنامج.
يصف كائن Class خصائص فئة معينة. يتم استخدامه لتنفيذ التفكير التلقائي.
يمكننا إنشاء كائنات Class من خلال:
استخدام طريقة forName()
يقبل forName() معامل نصي (اسم الفئة) ويقوم بتقديم Class. يرجع العنصر إلى الفئة المحددة المشار إليها من قبل النص. على سبيل المثال،
Class Dog { } Class c1 = Class.forName("Dog");
استخدام طريقة getClass()
يستخدم طريقة getClass() لإنشاء عميل جديد باستخدام عميل معين للفئة. على سبيل المثال،
Dog d1 = new Dog() Class c1 = d1.getClass();
استخدام .class
يمكننا أيضًا استخدام.classإنشاء Class باستخدام اسم النطاق. على سبيل المثال،
Class c1 = Dog.class;
بعد إنشاء Class، يمكننا استخدام هذه الأجهزة لتنفيذ التأمل.
يمكننا استخدام طريقة getInterfaces() الخاصة بـClass لجمع معلومات حول الواجهات التي يتم تنفيذها من قبل الفئة. يرجع هذا الطريقة إلى مجموعة واجهات.
استيراد java.lang.Class; استيراد java.lang.reflect.*; interface Animal { public void display(); e.printStackTrace(); interface Mammal { public void makeSound(); e.printStackTrace(); class Dog implements Animal, Mammal { public void display() { System.out.println("I am a dog."); e.printStackTrace(); public void makeSound() { System.out.println("Bark bark"); e.printStackTrace(); e.printStackTrace(); فئة ReflectionDemo { public static void main(String[] args) { try { //إنشاء عميل لـDog كائن Dog d1 = new Dog(); //استخدام getClass() لإنشاء Class فئة obj = d1.getClass(); //البحث عن الواجهات التي يتم تنفيذها بواسطة Dog Class[] objInterface = obj.getInterfaces(); for(Class c : objInterface) { //طباعة اسم واجهة System.out.println("اسم واجهة: " + c.getName()); e.printStackTrace(); e.printStackTrace(); System.out.println("عدد المعلمات: " + c.getParameterCount()); catch(Exception e) { e.printStackTrace(); e.printStackTrace(); e.printStackTrace();
}
اسم واجهة: Animal اسم واجهة: Mammal
يمكن استخدام طريقة getSuperclass() الخاصة بـClass للحصول على معلومات حول الأب الخاص بالفئة المحددة.
وClass يقدم طريقة getModifier()، التي تعود الأداة الخاصة بالـclass بصيغة عددية.
استيراد java.lang.Class; استيراد java.lang.reflect.*; interface Animal { public void display(); e.printStackTrace(); public class Dog implements Animal { public void display() { System.out.println("I am a dog."); e.printStackTrace(); e.printStackTrace(); فئة ReflectionDemo { public static void main(String[] args) { try { //إنشاء عميل لـDog كائن Dog d1 = new Dog(); //استخدام getClass() لإنشاء Class فئة obj = d1.getClass(); //الحصول على修饰符 الوصول الخاصة بـDog بصيغة عددية int modifier = obj.getModifiers(); int modifier = c.getModifiers(); //找到Dog的超类 Class superClass = obj.getSuperclass(); System.out.println("Superclass: " + superClass.getName()); e.printStackTrace(); System.out.println("عدد المعلمات: " + c.getParameterCount()); catch(Exception e) { e.printStackTrace(); e.printStackTrace(); e.printStackTrace();
}
المعلمات: 0 Superclass: Animal
该软件包java.lang.reflect提供了可用于操作类成员的类。例如,
方法类 - 提供有关类中方法的信息
字段类 - 提供有关类中字段的信息
构造函数类 - 提供有关类中构造函数的信息
我们可以使用Field类提供的各种方法检查和修改类的不同字段。
getFields() - 返回该类及其超类的所有公共字段
getDeclaredFields() - 返回类的所有字段
getModifier() - 以整数形式返回字段的修饰符
set(classObject,value) - 使用指定的值设置字段的值
get(classObject) - 获取字段的值
setAccessible(boolean) - 使私有字段可访问
注意:如果我们知道字段名称,则可以使用
getField("fieldName") - 从类返回名称为fieldName的公共字段。
getDeclaredField("fieldName") - 从类返回名称为fieldName的字段。
استيراد java.lang.Class; استيراد java.lang.reflect.*; فئة Dog { public String type; e.printStackTrace(); فئة ReflectionDemo { public static void main(String[] args) { try{ كائن Dog d1 = new Dog(); //创建Class对象 فئة obj = d1.getClass(); //操纵Dog类的公共字段type Field field1 = obj.getField("type"); //设置字段的值 field1.set(d1, "labrador"); //通过转换成字符串来获取字段的值 String typeValue = (String)field1.get(d1); System.out.println("نوع: " + typeValue); //获取类型的访问修饰符 int mod1 = field1.getModifiers(); String modifier1 = Modifier.toString(mod1); System.out.println("التعديل: " + modifier1); System.out.println(" "); e.printStackTrace(); System.out.println("عدد المعلمات: " + c.getParameterCount()); catch(Exception e) { e.printStackTrace(); e.printStackTrace(); e.printStackTrace();
}
type: labrador المعلمات: 0
استيراد java.lang.Class; استيراد java.lang.reflect.*; فئة Dog { private String color; e.printStackTrace(); فئة ReflectionDemo { public static void main(String[] args) { try { كائن Dog d1 = new Dog(); //إنشاء كائن Class فئة obj = d1.getClass(); //الوصول إلى الحقل الخاص Field field2 = obj.getDeclaredField("color"); //جعل الحقل الخاص قابل للوصول field2.setAccessible(true); //تعيين قيمة color field2.set(d1, "brown"); //الحصول على القيمة النوعية لتحويلها في String String colorValue = (String)field2.get(d1); System.out.println("color: " + colorValue); //الحصول على修饰ator الوصول لـcolor int mod2 = field2.getModifiers(); String modifier2 = Modifier.toString(mod2); System.out.println("modifier: " + modifier2); e.printStackTrace(); System.out.println("عدد المعلمات: " + c.getParameterCount()); catch(Exception e) { e.printStackTrace(); e.printStackTrace(); e.printStackTrace();
}
color: brown modifier: private
مثل الحقول، يمكننا استخدام مجموعة من الطرق التي يقدمها كائن Method للتحقق من الطرق المختلفة للفئة.
getMethods() - عودة جميع الطرق العامة للفئة والفئات الأصلية
getDeclaredMethod() - عودة جميع الطرق للفئة
getName() - عودة اسم الطريقة
getModifiers() - عودة修饰ator للطريقة بصيغة عددية
getReturnType() - عودة نوع العودة للطريقة
استيراد java.lang.Class; استيراد java.lang.reflect.*; فئة Dog { public void display() { System.out.println("I am a dog."); e.printStackTrace(); protected void eat() { System.out.println("I eat dog food."); e.printStackTrace(); private void makeSound() { System.out.println("Bark Bark"); e.printStackTrace(); e.printStackTrace(); فئة ReflectionDemo { public static void main(String[] args) { try { كائن Dog d1 = new Dog(); //إنشاء كائن Class فئة obj = d1.getClass(); //استخدام getDeclaredMethod() للحصول على جميع الطرق Method[] methods = obj.getDeclaredMethods(); //الحصول على اسم الطريقة for(Method m : methods) { System.out.println("اسم الطريقة: " + m.getName()); //الحصول على المُعديل للطريقة int modifier = m.getModifiers(); int modifier = c.getModifiers(); //الحصول على نوع العودة للطريقة System.out.println("نوع العودة: " + m.getReturnType()); System.out.println(" "); e.printStackTrace(); e.printStackTrace(); System.out.println("عدد المعلمات: " + c.getParameterCount()); catch(Exception e) { e.printStackTrace(); e.printStackTrace(); e.printStackTrace();
}
اسم الطريقة: display المعلمات: 0 نوع العودة: void اسم الطريقة: eat المُعديل: protected نوع العودة: void اسم الطريقة: makeSound المعلمات: 2 نوع العودة: void
يمكننا أيضًا استخدام طرق فئة Constructor للتحقق من المُنشئات المختلفة للفئة.
getConstructors() - العدد المطلوب لجدول المُنشئ لكل فئة عامة وللفئة الأب
getDeclaredConstructor() - العدد المطلوب لجدول المُنشئ
getName() - العدد المطلوب لجدول المُنشئ
getModifiers() - العدد المطلوب لجدول المُنشئ كعدد
getParameterCount() - العدد المطلوب لجدول المُنشئ
استيراد java.lang.Class; استيراد java.lang.reflect.*; فئة Dog { public Dog() { e.printStackTrace(); public Dog(int age) { e.printStackTrace(); private Dog(String sound, String type) { e.printStackTrace(); e.printStackTrace(); فئة ReflectionDemo { public static void main(String[] args) { try { كائن Dog d1 = new Dog(); فئة obj = d1.getClass(); //للحصول على جميع المُنشئات في فئة باستخدام getDeclaredConstructor() مُنشئ[] مُنشئون = obj.getDeclaredConstructors(); for(Constructor c : constructors) { for(Constructor c : constructors) { //الحصول على اسم المكون System.out.println("اسم المكون: " + c.getName()); //الحصول على معلمات الوصول للمكون int modifier = c.getModifiers(); System.out.println("المعلمات: " + Modifier.toString(modifier)); //الحصول على عدد المعلمات في المكون e.printStackTrace(); e.printStackTrace(); System.out.println("عدد المعلمات: " + c.getParameterCount()); catch(Exception e) { e.printStackTrace(); e.printStackTrace(); e.printStackTrace();
}
اسم المكون: Dog المعلمات: 0 نتيجة الإخراج اسم المكون: Dog المعلمات: 0 عدد المعلمات: 1 اسم المكون: Dog المعلمات: 2 عدد المعلمات: 2