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

Javaの反射メカニズムの使用方法と例のまとめ

この記事では、Javaプログラミングの反射メカニズムの使い方を説明します。以下に詳細を示します。

前書き:反射:動的クラス(バイトコードファイル、例えばこの記事のPerson.class)を取得し、そのメンバを実行。Androidアプリケーションレベルの開発では少し少ないかもしれませんが、基層を通じたい人にとっては、熟练に使用する必要があります。

エンティティクラス

Person.java

package com.sunwenou.reflect;// パッケージ名
public class Person {
  private String name;
  private int age;
  public Person() {// 無参
  }
  public Person(String name, int age) {// 引数付き
    super();
    this.name = name;
    this.age = age;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  @Override
  public String toString() {
    return name+","+age;
  }
  public void show() { // 引数なし
    System.out.println("show");
  }
  public void fun(String ss) { // 引数付き
    System.out.println(ss);
  }
  public static void function() { // 静的
    System.out.println("static");
  }
}

動的にバイトコードファイルを取得する方法

この記事では、ブログが簡潔に見えるように、一概にExceptionをスローし、importを省略します

package com.sunwenou.reflect;
public class Demo1 {
  /**
   * 動的にバイトコードファイルを取得する方法
   * 1:使用Objectクラスが提供するClass getClass()メソッド
   *  この方法はオブジェクトが必要です
   * 2:各データタイプには静的のclass属性があります、この属性はそのデータタイプの所属のバイトコードファイルオブジェクトを返します
   *  int.class  Person.class
   * 3:使用 Class提供的 forName()方法
   *  パッケージ名を含む文字列を提供する必要があります+クラス名の構成
   */
  public static void main(String[] args) throws Exception {
    //getClaz();
    //getCalz2()
    getClaz3()
  }
  //Classが提供するforName()メソッドを使用します
  public static void getClaz3() throws Exception {
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Class<?> claz2 = Class.forName("com.sunwenou.reflect.Person");
    System.out.println(claz==claz2);
  }
  //各データタイプには静的のclass属性があります
  public static void getCalz2() {
    Class<Person> p1 = Person.class;
    Class<Person> p2 = Person.class;
    System.out.println(p1==p2);
  }
  //Objectクラスが提供するClass getClass()メソッドを使用します
  public static void getClaz() {
    Person person1 = new Person();
    Class<? extends Person> claz = person1.getClass();//Person.class
    Person person2 = new Person();
    Class<? extends Person> claz2 = person2.getClass();//Person.class
    System.out.println(claz==claz2);
  }
}

クラスを動的に取得し、オブジェクトを作成します

package com.sunwenou.reflect;
public class Demo2 {
  public static void main(String[] args) throws Exception {
    //createObj();
    createObj2()
  }
  public static void createObj2() throws Exception {
    //Person person = new Person("lisi",23);
    //バイトコードファイルオブジェクトを取得
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");//Person.class
    //パラメータ付きのコンストラクタを所有するConstructorオブジェクトを取得します
    Constructor constructor = claz.getConstructor(String.class,int.class);
    //Constructorクラスが提供するオブジェクトの作成メソッドを使用してオブジェクトを作成します
    Person person = (Person)constructor.newInstance("lisi",23);
    System.out.println(person);
  }
  public static void createObj() throws Exception {
    //Person person = new Person();
    //バイトコードファイルオブジェクトを取得
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Object obj = claz.newInstance();//デフォルトで空の引数のコンストラクタを使用してオブジェクトを作成します
    System.out.println(obj);
  }
}

動的にクラスを取得し、メンバ変数に値を設定します

package com.sunwenou.reflect;
public class Demo3 {
  public static void main(String[] args) throws Exception {
    //Person p = new Person();
    //p.name = "lisi";
    //バイトコードファイルオブジェクトを取得
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    //メンバ変数の所有するFieldオブジェクトを取得します
    //Field field = claz.getField("name");//public権限のメンバを取得します
    Field field = claz.getDeclaredField("name");//すべての宣言されたフィールドを取得します
    System.out.println(field);
    //非静的メンバ変数はオブジェクトに依存しています
    Object obj = claz.newInstance();
    field.setAccessible(true);//強制的にアクセス可能に設定します
    field.set(obj, "张三");
    System.out.println(obj);
  }
}

クラスを動的に取得し、メソッドを実行します

package com.sunwenou.reflect;
public class Demo4 {
  public static void main(String[] args) throws Exception {
    //method1()
    method2()
    method3()
  }
  public static void method3() throws Exception {
    //バイトコードファイルオブジェクトを取得
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Method m = claz.getMethod("function", null);
    m.invoke(null, null);
  }
  ////パラメータ付きのメソッドを実行します
  public static void method2() throws Exception {
    //バイトコードファイルオブジェクトを取得
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    Method m = claz.getMethod("fun", String.class);
    Object obj = claz.newInstance();
    m.invoke(obj, "hello");
  }
  //無引数のメソッドを実行
  public static void method1() throws Exception {
    //Person person = new Person(); person.show();
    //バイトコードファイルオブジェクトを取得
    Class<?> claz = Class.forName("com.sunwenou.reflect.Person");
    //実行されるメソッドのバイトコードファイルオブジェクトを取得
    Method m = claz.getMethod("show", null);
    //非静的方法はオブジェクトに依存しています
    Object obj = claz.newInstance();
    //メソッドの実行
    m.invoke(obj, null);
  }
}

これがリフレクトの基本的な使い方です。通常のオブジェクトの作成ができない場合、オブジェクトのバイトコードファイルを通じてオブジェクトを作成し、その中のメソッドを実行することができます。学びましたか??

Javaに関するさらに詳しい内容に興味を持つ読者は、以下のサイトの特集を参照してください:《Java オブジェクト指向プログラミング 入門と進階教程》、《Java データ構造とアルゴリズム教程》、《Java DOM ノード操作の技術的まとめ》、《Java ファイルとディレクトリ操作の技術的まとめ》および《Java キャッシュ操作の技術的まとめ》

この記事で述べたことが皆様のJavaプログラム設計に役立つことを願っています。

声明:この記事の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーにより自発的に貢献し、自己でアップロードされました。このサイトは所有権を持ちません。また、人工的な編集は行われていません。著作権侵害が疑われる内容がある場合は、以下のメールアドレスまでご連絡ください:notice#oldtoolbag.com(メール送信時は、#を@に変更してください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、このサイトは即座に侵害される可能性のある内容を削除します。)

おすすめ