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

تعليمات Java الأساسية

Java Flow Control

Java Arrays

Java Object-Oriented (I)

Java Object-Oriented (II)

Java Object-Oriented (III)

معالجة الاستثنائات Java

Java List

Java Queue (Queue)

Java Map Collections

Java Set Collections

Java Input/Output (I/O)

Java Reader/Writer

مواضيع أخرى في Java

الإعكس Java (Reflection)

في هذا الدرس، سنتعلم التفكير التلقائي، وهو ميزة في برمجة Java تسمح لنا بفحص وتعديل الفئات والطرق وما إلى ذلك.

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

اسم الفئة في Java هو Class

قبل تعلم التفكير التلقائي في Java، يجب أن نفهم فئة Java المسمى Class.

يوجد في Java فئة تُدعى Class، وتحتفظ هذه الفئة بمعلومات كاملة عن الكائنات والفئات عند تشغيل البرنامج.

يصف كائن 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提供了可用于操作类成员的类。例如,

  • 方法类 - 提供有关类中方法的信息

  • 字段类 - 提供有关类中字段的信息

  • 构造函数类  - 提供有关类中构造函数的信息

Java 反射与字段

 我们可以使用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

Java الت反射 والطرق

مثل الحقول، يمكننا استخدام مجموعة من الطرق التي يقدمها كائن 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

مرآة Java والمنشئ

يمكننا أيضًا استخدام طرق فئة 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