Javaの反射?これは変だ

Java リフレクション テクノロジー: Java プログラムの動作メカニズムを探る

Java は人気のある言語として、さまざまなプロジェクトで広く使用されています。リフレクション テクノロジは、Java の重要な基本機能の 1 つです。リフレクション テクノロジを通じて、Java プログラムはクラス情報を取得し、実行時にクラスのメソッドと属性にアクセスし、動的にオブジェクトを作成してオブジェクト メソッドを呼び出すこともできるため、プログラミングがより柔軟かつ効率的になります。この記事では、Javaのリフレクション機構の動作原理、利用方法、関連事例を紹介します。

1. 反射機構の概念と原理

Java プログラムを実行すると、ソース コードが .class ファイルにコンパイルされ、最終的に実行可能プログラムが生成されます。このプロセス中に、Java 仮想マシンは .class ファイルのロード、リンク、初期化などの操作を実行して、プログラムの実行を実現します。リフレクション機構は、プログラム実行時に読み込まれたJavaクラスを解析して操作する技術です。

リフレクション メカニズムを通じて、Java プログラムは実行時にクラスの構造を分析し、クラスのメソッド、属性、コンストラクターなどの情報を取得できます。具体的には、反映メカニズムには主に次の 3 つの側面が含まれます。

1. クラスの Class オブジェクトを取得します。各 Java クラスには実行時に対応する Class オブジェクトがあり、リフレクション メカニズムは Class オブジェクトを通じて関連情報を取得できます。

2. オブジェクトのメソッドとプロパティにアクセスします。リフレクション メカニズムは、Class オブジェクトを通じてクラスのメソッド、プロパティ、コンストラクタを取得し、それらを呼び出して設定します。

3. 新しいオブジェクトの作成: リフレクション メカニズムは、新しい Java オブジェクトを動的に作成し、オブジェクトのメソッドとプロパティを呼び出すことができます。

2つ目は、反射機構を利用する方法です。

1.クラスオブジェクトを取得する

Class オブジェクトを取得するには、次の 3 つの方法があります。

1) クラス名で Class オブジェクトを作成します。

Class clz = Class.forName("java.lang.String");

2) クラスのインスタンスオブジェクトのgetClass()メソッドでClassオブジェクトを取得します。

String s = new String();
Class clz = s.getClass();

3) クラスの .class 属性を通じて Class オブジェクトを取得します。

Class clz = int.class;

2. クラスのプロパティとメソッドを取得する

クラスのコンストラクター、メソッド、プロパティは次の方法で取得できます。

1) クラスのコンストラクターを取得します。

Constructor[] constructors = clz.getDeclaredConstructors();

2) クラスのメンバープロパティを取得します。

Field[] fields = clz.getDeclaredFields();

3) クラスのメンバーメソッドを取得する

Method[] methods = clz.getDeclaredMethods();

クラスのプロパティとメソッドについては、次のメソッドを通じて呼び出すこともできます。

1) クラスのメソッドを呼び出す

Method method = clz.getDeclaredMethod("methodName", parameterTypes);
Object result = method.invoke(object, args);

2) クラスのメンバープロパティを読み取るか設定します。

Field field = clz.getDeclaredField("fieldName");
field.setAccessible(true);
Object result = field.get(object);
field.set(object, value);

3) 新しいオブジェクトを作成する

Constructor constructor = clz.getDeclaredConstructor(parameterTypes);
Object object = constructor.newInstance(args);

具体的には、createNewInstance メソッドはリフレクション テクノロジを使用して、指定されたクラス名を持つオブジェクトを作成し、それを返します。同時に、getDeclaredMethod および invoke メソッドを通じて、オブジェクト内のメソッドを呼び出し、実行結果を返すことができます。同様に、getDeclaredField メソッドと get メソッドおよび set メソッドは、オブジェクト内のメンバー プロパティ値を読み取りまたは設定できます。

3. 反射の技術が上陸しました(王の栄光編)

以下は、単純なリフレクション メカニズムのケース コードです。この例では、リフレクション メカニズムを使用してカスタム オブジェクトを作成し、オブジェクト上でそのメソッドとメンバー変数を呼び出して処理します。

リフレクション テクノロジーを使用してキング オブ グローリーのヒーローを作成するにはどうすればよいですか?

Glory of Kings のゲームでは、ヒーローは独自の属性を持っています。たとえば、Yu Ji の攻撃力は比較的高く、Cheng Yaojin の防御力は非常に強力です。ヒーローオブジェクトを作成し、リフレクション技術を通じて属性値を設定したい場合はどうすればよいでしょうか? 次に簡単に紹介していきます。

まず、ヒーローのテンプレートとしてヒーロー クラスを定義する必要があります。コードは以下のように表示されます。

public class Hero {
    private String name;
    private int attack;
    private int defense;

    public Hero() {
    }

    public Hero(String name, int attack, int defense) {
        this.name = name;
        this.attack = attack;
        this.defense = defense;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAttack() {
        return attack;
    }

    public void setAttack(int attack) {
        this.attack = attack;
    }

    public int getDefense() {
        return defense;
    }

    public void setDefense(int defense) {
        this.defense = defense;
    }

    @Override
    public String toString() {
        return "Hero{" +
                "name='" + name + '\'' +
                ", attack=" + attack +
                ", defense=" + defense +
                '}';
    }
}

次に、いくつかの特定のヒーロー クラスを定義し、そのヒーロー クラスを継承し、その特性に従っていくつかのプロパティまたはメソッドを書き換えます。たとえば、Yu Ji は次のように定義できます。

public class YuJi extends Hero {
    public YuJi() {
        super("虞姬", 100, 50);
    }
}

最後に、リフレクション技術を使用してヒーローを作成し、その属性値を設定できます。具体的なコードは次のとおりです。

public class ReflectionTest {
    public static void main(String[] args) throws Exception {
        Class<?> clazz = Class.forName("com.example.YuJi"); // 获取YuJi类的Class对象
        Object obj = clazz.newInstance(); // 动态创建YuJi对象

        Field attackField = clazz.getDeclaredField("attack"); // 获取attack属性
        attackField.setAccessible(true); // 设置访问权限为true
        attackField.set(obj, 200); // 设置attack属性值为200

        Field defenseField = clazz.getDeclaredField("defense"); // 获取defense属性
        defenseField.setAccessible(true); // 设置访问权限为true
        defenseField.set(obj, 80); // 设置defense属性值为80

        System.out.println(obj); // 输出YuJi对象
    }
}

上記のコードを実行すると、出力は次のようになります: Hero{name='Yu Ji', Attack=200, Defense=80}。

上記の例から、Java リフレクション テクノロジを使用すると、ヒーロー オブジェクトを動的に作成し、対応する属性値を設定するのに役立つことがわかります。実際の開発では、リフレクション テクノロジには、動的プロキシ、アノテーション プロセッサなど、他にも多くのアプリケーション シナリオがあります。

要約する

Glory of Kings のヒーローには独自の属性があり、リフレクション テクノロジーを使用してこれらの属性を動的に作成および設定できます。実際の開発では、リフレクション テクノロジにより、クラス、メソッド、属性などの関連情報を操作するための非常に柔軟で拡張可能な方法が提供されます。

var code = "5c544e5b-0e30-4abc-8076-df5862630dff"

おすすめ

転載: blog.csdn.net/weixin_39570751/article/details/130866061
おすすめ