ホームページ  >  記事  >  Java  >  Javaの反映機構例を詳しく解説

Javaの反映機構例を詳しく解説

黄舟
黄舟オリジナル
2017-09-08 11:04:221109ブラウズ

この記事では、Java のリフレクション メカニズムの例の詳細な説明に関する関連情報を主に紹介します。必要な方は、Java のリフレクション メカニズムの詳細な分析を参照してください。

1. JAVAは動的言語ですか?

一般的に言えば、動的言語とは、プログラムの実行中にプログラム構造や変数の型が変更できることを意味します。この観点から見ると、Java は C++ と同様に動的言語ではありません。

しかし、JAVA には、リフレクションという非常に顕著な動的関連メカニズムがあります。リフレクションを通じて、Java は実行時のコンパイル中に完全に合計されたクラスをロード、検出、使用したり、オブジェクト エンティティを生成したり、メソッドを呼び出したり、プロパティの値を設定したりできます。したがって、Java は半動的言語とみなされます。

リフレクションの概念:

Java のリフレクション メカニズムは、実行状態では、どのクラスについても、このクラスのすべてのプロパティとメソッドを認識できることを意味します。

どのオブジェクトについても、そのメソッドのいずれかを呼び出すことができます。メソッド;

動的に情報を取得し、オブジェクトのメソッドを動的に呼び出すこの機能は、Java 言語のリフレクション機構と呼ばれます

2. 動的プロパティ

2.1、動的プロパティ

実行時にオブジェクトインスタンスを生成します。メソッドは期間中に呼び出されます。 実行時に属性を変更する

2.2. Java リフレクション機構が実装できる関数


実行時に任意のオブジェクトが属するクラスを判断する

実行時に任意のクラスのオブジェクトを構築する

実行時 任意のクラスのメソッドとプロパティ 実行時に任意のオブジェクトのメソッドを呼び出す 動的プロキシを生成する



2.3、Java リフレクション アプリケーションのシナリオ


Java プログラムの多くのオブジェクトは、実行時に 2 つのタイプで表示されます タイプ: コンパイル- 時型と実行時型

コンパイル時型はオブジェクトの宣言時に使用される型によって決まり、実行時型は実際にオブジェクトに割り当てられる型によって決まります例:

Person p =new Student();

コンパイル時の型は person で、実行時は Student です

さらに、プログラムは実行時に外部から渡されるオブジェクトを受け取ることもありますが、オブジェクトのコンパイル時の型は Object ですが、プログラムが必要とするものです。オブジェクトのランタイム型を呼び出します。これらの問題を解決するには、プログラムは実行時にオブジェクトとクラスに関する実際の情報を検出する必要があります。ただし、オブジェクトとクラスがどのクラスに属するかをコンパイル時に予測できず、プログラムがオブジェクトとクラスの実際の情報を検出するために実行時情報のみに依存する場合は、この時点でリフレクションを使用する必要があります


3. Java リフレクション API

リフレクション API は、現在の JAVA 仮想マシンのクラス、インターフェイス、またはオブジェクトに関する情報を生成するために使用されます。

Class クラス: クラスの属性、メソッド、その他のコンテンツ情報を取得できるリフレクションのコア クラス。 フィールドクラス: Java.lang.reflect. クラスの属性を表し、クラスの属性値を取得および設定できます。 メソッドクラス: Java.lang.reflect.クラスのメソッドを表します。これは、クラス内のメソッドに関する情報を取得したり、メソッド

Construcor クラス: Java.lang.reflect を実行したりするために使用できます。クラスのコンストラクター メソッドを表します。


4. すべてのメソッドとプロパティを取得します


personクラス

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;
  }

}

リフレクションを使用します:


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("路径输入错误!");
    }
  }

}

package com.pb.Reflect.classinfo;

public class TestReflection {

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

  }

}

com.pb.Reflect.classinfo.person
と入力します。

結果:


========获取方法信息============
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)
========获取构造方法信息结束============

5. リフレクションを使用する手順


5.1. 手順

Java.lang.reflect

クラスを操作したいJava.lang.Classオブジェクトを取得するClassのメソッドを呼び出すこの情報を操作するにはリフレクション API を使用します

5.2. Class オブジェクトの取得方法



オブジェクトの getClass() メソッドを呼び出します

Person p = new Person();
Class cla=p.getClass();

特定のクラスの class 属性を呼び出して Class を取得しますクラスに対応するオブジェクト


Class cls=Person.class;

ClassクラスのforName()静的メソッドを使用します


Class cla=Class.forName(“类的全路径”);


6. 2番目のメソッドはobject


personクラスのgetClass()メソッドです, オブジェクトを宣言するため、コンストラクターメソッドは public

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;
  }

}

Use Reflection:


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("========获取成员构造方法信息结束============");
  }

}

Test class


package com.pb.Reflect.classinfo;

public class TestReflection {

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

  }

}

========获取方法信息============
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)
========获取成员构造方法信息结束============


7. の .class 属性3番目のメソッドクラス


personクラスは上と同じです

テストクラス:

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("========获取成员构造方法信息结束============");
  }

}

結果:

上と同じ


========获取方法信息============
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)
========获取成员构造方法信息结束============

以上がJavaの反映機構例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。