Heim > Java > javaLernprogramm > Detaillierte Erläuterung von Beispielen für Reflexionsmechanismen in Java

Detaillierte Erläuterung von Beispielen für Reflexionsmechanismen in Java

黄舟
Freigeben: 2017-09-08 11:04:22
Original
1129 Leute haben es durchsucht

Dieser Artikel enthält hauptsächlich relevante Informationen zur detaillierten Erläuterung von Beispielen für Java-Reflexionsmechanismen. Hier finden Sie eine detaillierte Analyse des Reflexionsmechanismus in Java.

Detaillierte Erläuterungen zu Java Beispiele für Reflexionsmechanismen.

1. Ist JAVA eine dynamische Sprache?

Im Allgemeinen bedeutet dies, dass bei dynamischen Sprachen die Programmstruktur oder der Variablentyp geändert werden darf, während das Programm ausgeführt wird. Aus dieser Sicht gilt Java wie C++. ist keine dynamische Sprache.

Aber JAVA verfügt über einen sehr wichtigen dynamischen Mechanismus: Reflexion. Durch Reflektion kann Java Klassen laden, erkennen und verwenden, die während der Kompilierung zur Laufzeit vollständig summiert wurden, ihre Objektentitäten generieren, ihre Methoden aufrufen oder Werte für Eigenschaften festlegen. Daher gilt Java als semidynamische Sprache.

Das Konzept der Reflexion:

Der Reflexionsmechanismus in Java bedeutet, dass im laufenden Zustand für jede Klasse alle Eigenschaften und Methoden dieser Klasse bekannt sein können;

Für jedes Objekt können Sie jede seiner Methoden aufrufen;

Diese Funktion zum dynamischen Abrufen von Informationen und zum dynamischen Aufrufen von Objektmethoden wird als Reflexionsmechanismus der Java-Sprache bezeichnet

II , Dynamisch Eigenschaften

2.1, Dynamische Eigenschaften

Objektinstanzen zur Laufzeit generieren;
Methoden zur Laufzeit aufrufen;
Attribute zur Laufzeit ändern

2.2. Funktionen, die der Java-Reflexionsmechanismus erreichen kann

Bestimmen Sie die Klasse, zu der ein Objekt zur Laufzeit gehört.
Erstellen Sie zur Laufzeit ein beliebiges Objekt
bestimmt die Methoden und Attribute einer beliebigen Klasse zur Laufzeit
ruft die Methode eines beliebigen Objekts zur Laufzeit auf
generiert einen dynamischen Proxy

2.3 Java-Reflection-Anwendungsszenarien

Viele Objekte in Java-Programmen haben zur Laufzeit zwei Typen: Typ zur Kompilierungszeit und Typ zur Laufzeit

Der Typ zur Kompilierungszeit wird durch den Zeitpunkt bestimmt, zu dem das Objekt deklariert wird Der verwendete Typ wird durch den Typ bestimmt, der zur Laufzeit dem Objekt tatsächlich zugewiesen ist.

Zum Beispiel:


Person p =new Student();
Nach dem Login kopieren

Der Typ zur Kompilierungszeit ist Person und die Laufzeit ist Student

Darüber hinaus kann das Programm während der Laufzeit auch ein von außen übergebenes Objekt empfangen. Der Typ zur Kompilierungszeit des Objekts ist Objekt, aber das Programm muss den Laufzeittyp der Objektmethode aufrufen. Um diese Probleme zu lösen, müssen Programme zur Laufzeit echte Informationen über Objekte und Klassen ermitteln. Wenn es jedoch zur Kompilierungszeit unmöglich ist, vorherzusagen, zu welchen Klassen das Objekt und die Klasse gehören könnten, und das Programm nur auf Laufzeitinformationen angewiesen ist, um die tatsächlichen Informationen des Objekts und der Klasse zu ermitteln, muss zu diesem Zeitpunkt Reflektion verwendet werden

3. Java Reflection API

Reflection API wird verwendet, um Informationen über Klassen, Schnittstellen oder Objekte in der aktuellen JAVA Virtual Machine zu generieren.

Klassenklasse: Die Kernklasse der Reflexion, die die Attribute, Methoden und andere Inhaltsinformationen der Klasse abrufen kann.
Feldklasse: Java.lang.reflect Stellt die Attribute der Klasse dar und kann die Attributwerte der Klasse abrufen und festlegen.
Methodenklasse: Java.lang.reflect. Stellt eine Methode einer Klasse dar, die verwendet werden kann, um Informationen über Methoden in einer Klasse abzurufen oder Methoden auszuführen
Konstruktorklasse: Java.lang.reflect. Stellt die Konstruktormethode der Klasse dar.

4. Alle Methoden und Attribute abrufen

Personenklasse


package com.pb.Reflect.classinfo;

public class Person {
  private String name;
  private String gender;
  private int age;

  private Person() {
  //
  }
  public Person(String name, String gender, int age) {
    super();
    this.name = name;
    this.gender = gender;
    this.age = age;
  }
  //getter、和setter方法
  private String getName() {
    return name;
  }
  private void setName(String name) {
    this.name = name;
  }
  public String getGender() {
    return gender;
  }
  public void setGender(String gender) {
    this.gender = gender;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }

  public String toString(){
    return "姓名:"+name+"年龄: "+age;
  }

}
Nach dem Login kopieren

Reflexion verwenden :


package com.pb.Reflect.classinfo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.swing.JOptionPane;

/*
 * 通过用户输入类的全路径,来获取该类的成员方法和属性
 * Declared获取全部不管是私有和公有
 * 1.获取访问类的Class对象
 * 2.调用Class对象的方法返回访问类的方法和属性信息
 */
public class ReflectDemo {

  /*
   * 构造方法
   */
  public ReflectDemo(){
    //用户输入类的全路径径
    //使用String组件
    String classpsth=JOptionPane.showInputDialog(null,"输入类的全路径");
    //使用Class.forName方法根据输入的类的全路径 返回该类的Class对象
    try {
      Class cla = Class.forName(classpsth);
      //利用Class对象的cla的自审,返回方法对象集合
      Method [] method=cla.getDeclaredMethods(); //返回所有的方法
      System.out.println("========获取方法信息============");
      for (Method meth : method) {
        //遍历method数组,并输出方法信息
        System.out.println(meth.toString());
      }
      System.out.println("========获取出方法信息结束============");
      //获取属性利用Class对象的cla的自审,返回成员属性对象集合
       Field [] field=cla.getDeclaredFields();
        System.out.println("========获取成员属性信息============");
        for (Field f : field) {
          System.out.println(f.toString());
        }
        System.out.println("========获取成员属性信息结束============");
      //获取属性利用Class对象的cla的自审,返回构造方法集合
        Constructor [] constructor=cla.getDeclaredConstructors();
        System.out.println("========获取成员构造方法信息============");
        for (Constructor constru : constructor) {
          System.out.println(constru.toString());
        }
        System.out.println("========获取成员构造方法信息结束============");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
      System.out.println("路径输入错误!");
    }
  }

}
Nach dem Login kopieren


package com.pb.Reflect.classinfo;

public class TestReflection {

  public static void main(String[] args) {
    ReflectDemo rd=new ReflectDemo();

  }

}
Nach dem Login kopieren

Geben Sie com.pb.Reflect.classinfo.Person ein

Ergebnis:


========获取方法信息============
public java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public int com.pb.Reflect.classinfo.Person.getAge()
public void com.pb.Reflect.classinfo.Person.setAge(int)
public java.lang.String com.pb.Reflect.classinfo.Person.toString()
private java.lang.String com.pb.Reflect.classinfo.Person.getName()
private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private java.lang.String com.pb.Reflect.classinfo.Person.name
private java.lang.String com.pb.Reflect.classinfo.Person.gender
private int com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取构造方法信息============
private com.pb.Reflect.classinfo.Person()
public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)
========获取构造方法信息结束============
Nach dem Login kopieren

Schritte zur Verwendung von Reflektion

Schritte

Java.lang.reflect

Rufen Sie das Java.lang.Class-Objekt der Klasse ab, die Sie bedienen möchten
Rufen Sie die Methode von Class auf
Verwenden Sie die Reflection-API, um diese Informationen zu bedienen

5.2. So erhalten Sie das Class-Objekt

Rufen Sie die getClass()-Methode eines Objekts auf


Person p = new Person();
Class cla=p.getClass();
Nach dem Login kopieren

Rufen Sie das Klassenattribut einer Klasse auf. Um das der Klasse entsprechende Klassenobjekt zu erhalten


Class cls=Person.class;
Nach dem Login kopieren

Verwenden Sie die statische Methode forName() der Klassenklasse


Class cla=Class.forName(“类的全路径”);
Nach dem Login kopieren

6. Die getClass()-Methode des zweiten Methodenobjekts

Personenklasse, weil das Objekt deklariert werden soll, ist die Konstruktormethode öffentlich


package com.pb.Reflect.classinfo;

public class Person {
  private String name;
  private String gender;
  private int age;

  public Person() {
  //
  }
  public Person(String name, String gender, int age) {
    super();
    this.name = name;
    this.gender = gender;
    this.age = age;
  }
  //getter、和setter方法
  private String getName() {
    return name;
  }
  private void setName(String name) {
    this.name = name;
  }
  public String getGender() {
    return gender;
  }
  public void setGender(String gender) {
    this.gender = gender;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }

  public String toString(){
    return "姓名:"+name+"年龄: "+age;
  }

}
Nach dem Login kopieren

Reflection verwenden:


package com.pb.Reflect.classinfo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import javax.swing.JOptionPane;

/*
 * 通过用户输入类的全路径,来获取该类的成员方法和属性
 * Declared获取全部不管是私有和公有
 * 1.获取访问类的Class对象
 * 2.调用Class对象的方法返回访问类的方法和属性信息
 */

  public ReflectDemo(Person p){
    Class cla=p.getClass();
    //利用Class对象的cla的自审,返回方法对象集合
    Method [] method=cla.getDeclaredMethods(); //返回所有的方法
    System.out.println("========获取方法信息============");
    for (Method meth : method) {
      //遍历method数组,并输出方法信息
      System.out.println(meth.toString());
    }
    System.out.println("========获取出方法信息结束============");
    //获取属性利用Class对象的cla的自审,返回成员属性对象集合
     Field [] field=cla.getDeclaredFields();
      System.out.println("========获取成员属性信息============");
      for (Field f : field) {
        System.out.println(f.toString());
      }
      System.out.println("========获取成员属性信息结束============");
    //获取属性利用Class对象的cla的自审,返回构造方法集合
      Constructor [] constructor=cla.getDeclaredConstructors();
      System.out.println("========获取成员构造方法信息============");
      for (Constructor constru : constructor) {
        System.out.println(constru.toString());
      }
      System.out.println("========获取成员构造方法信息结束============");
  }

}
Nach dem Login kopieren

Test Klasse


package com.pb.Reflect.classinfo;

public class TestReflection {

  public static void main(String[] args) {
    Person p=new Person();
    ReflectDemo rd=new ReflectDemo(p);

  }

}
Nach dem Login kopieren


========获取方法信息============
public java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public int com.pb.Reflect.classinfo.Person.getAge()
public void com.pb.Reflect.classinfo.Person.setAge(int)
public java.lang.String com.pb.Reflect.classinfo.Person.toString()
private java.lang.String com.pb.Reflect.classinfo.Person.getName()
private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private java.lang.String com.pb.Reflect.classinfo.Person.name
private java.lang.String com.pb.Reflect.classinfo.Person.gender
private int com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取成员构造方法信息============
public com.pb.Reflect.classinfo.Person()
public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)
========获取成员构造方法信息结束============
Nach dem Login kopieren
Nach dem Login kopieren

7. Das .class-Attribut der dritten Methodenklasse

Personenklasse ist die gleiche wie oben

Testklasse:


package com.pb.Reflect.classinfo;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestReflection {

  public static void main(String[] args) {
    /*第二种方法
    Person p=new Person();
    ReflectDemo rd=new ReflectDemo(p);
*/

    /*
     * 第三种方式.class属性
     */
    Class cla=Person.class;
    //利用Class对象的cla的自审,返回方法对象集合
        Method [] method=cla.getDeclaredMethods(); //返回所有的方法
        System.out.println("========获取方法信息============");
        for (Method meth : method) {
          //遍历method数组,并输出方法信息
          System.out.println(meth.toString());
        }
        System.out.println("========获取出方法信息结束============");
        //获取属性利用Class对象的cla的自审,返回成员属性对象集合
         Field [] field=cla.getDeclaredFields();
          System.out.println("========获取成员属性信息============");
          for (Field f : field) {
            System.out.println(f.toString());
          }
          System.out.println("========获取成员属性信息结束============");
        //获取属性利用Class对象的cla的自审,返回构造方法集合
          Constructor [] constructor=cla.getDeclaredConstructors();
          System.out.println("========获取成员构造方法信息============");
          for (Constructor constru : constructor) {
            System.out.println(constru.toString());
          }
          System.out.println("========获取成员构造方法信息结束============");
  }

}
Nach dem Login kopieren

Ergebnis:

Gleiche wie oben


========获取方法信息============
public java.lang.String com.pb.Reflect.classinfo.Person.getGender()
public void com.pb.Reflect.classinfo.Person.setGender(java.lang.String)
public int com.pb.Reflect.classinfo.Person.getAge()
public void com.pb.Reflect.classinfo.Person.setAge(int)
public java.lang.String com.pb.Reflect.classinfo.Person.toString()
private java.lang.String com.pb.Reflect.classinfo.Person.getName()
private void com.pb.Reflect.classinfo.Person.setName(java.lang.String)
========获取出方法信息结束============
========获取成员属性信息============
private java.lang.String com.pb.Reflect.classinfo.Person.name
private java.lang.String com.pb.Reflect.classinfo.Person.gender
private int com.pb.Reflect.classinfo.Person.age
========获取成员属性信息结束============
========获取成员构造方法信息============
public com.pb.Reflect.classinfo.Person()
public com.pb.Reflect.classinfo.Person(java.lang.String,java.lang.String,int)
========获取成员构造方法信息结束============
Nach dem Login kopieren
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für Reflexionsmechanismen in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage