Java リフレクション メカニズムに関する知識ポイントは何ですか?

王林
リリース: 2023-05-21 12:34:20
転載
997 人が閲覧しました

クラス宣言サイクル

Java ソース コード----->javac-------------->Java バイトコード ファイル----- --- ------>java------>クラスオブジェクト(メモリ空間:メタスペース、ローカルメモリ)---------- ----- -------------新規-------->インスタンス化されたオブジェクト---- -gc---- -------->オブジェクトのアンロード

Java リフレクション メカニズムに関する知識ポイントは何ですか?

##クラス オブジェクトはさまざまな段階で取得できます

  • Object.getClass () (メモリステージ)

  • Test.class (メタスペース)

  • class.forName("クラスのフルネーム: パッケージ名、クラス名"): メモリ空間(ハードディスク)に入らずにオブジェクトを取得できます。

例えば、jdbcを使ってデータベースを操作する場合、メモリの前にこのクラスに入力すると、クラスのフルネーム (パッケージ名 クラス名) を使用し、クラスを呼び出し、

Java リフレクション メカニズムに関する知識ポイントは何ですか?

を使用して Class クラス オブジェクトを取得します。 ##Class.forName("クラスの完全名"): 主に構成ファイルで使用され、構成ファイルでクラス名を定義し、構成ファイルを読み取り、クラスをロードします

# #クラス名.class: 主にパラメータの受け渡しに使用されます
  • オブジェクト名.getClass(): 主にクラスオブジェクトのオブジェクト取得に使用されます
  • 概要 : 同じクラスローダーによってロードされたファイルは、プログラム実行中に 1 回だけロードされます。どのメソッドが使用されても、取得されるクラス オブジェクトは同じです。
  • コード例:

    package com.reflect;
    public class TestReflectPerson {
        public static void main(String[] args) throws ClassNotFoundException {
            //1.class.forName()
            Class class1=Class.forName("com.reflect.Person");
            System.out.println(class1);
            //2.类名.class
            Class class2=Person.class;
            System.out.println(class2);
            //2.对象名.getClass()
            Class class3=new Person().getClass();
            System.out.println(class3);
            System.out.println(class1==class2);  //true
            System.out.println(class2==class3);  //true
        }
    }
    ログイン後にコピー

    クラス object の関数
メンバー変数の取得: すべて取得: class object.getDeclaredFields()、1 つ取得: class object.getDeclaredField()

値セットの設定 (Object obj,Object value)

Get the value get(Object obj)
  • アクセス許可が変更されたメンバー変数を取得して設定値を取得します。必須 setAccessible(true) を使用します-----激しい反射
  • メンバー メソッド: class object.getDeclaredMethods()

    実行メソッド invoke(Object object,Object… agrs) (パラメーターの数)は任意、オプション)
メソッド名を取得 getName()

構築メソッド: Class object.getDeclaredConstructors()

パラメータのないコンストラクタが必要ですが、newInstance( ) メソッドでは、コンストラクターの取得とオブジェクトの取得のステップを省略できます。

このメソッドでは、実際のパラメーターを割り当てるための実際の構築メソッドが必要です。

//获得构造方法对象,
        Constructor cons1 = pcla.getDeclaredConstructor(String.class, int.class);
        Person p2 = (Person)cons1.newInstance("李四",19);
        System.out.println("p2:"+p2.getName());
ログイン後にコピー

newInstance() パラメーターのないコンストラクターを作成して、オブジェクトを作成するには、クラス オブジェクトを使用してオブジェクトを作成します。コンストラクター オブジェクトの取得をスキップします。

Get

クラスの名前を取得します: getName() フルネームを出力します: クラス名パッケージ名

のみ 別のクラス名を出力する場合: getSimpleName()

クラスのメンバー変数名を取得する

プロパティ ファイル:コンテンツは等号で接続されます (k=v、

Java リフレクション メカニズムに関する知識ポイントは何ですか?コード例:

package com.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestReflectPerson {
    public static void main(String[] args) throws Exception {
       /* //1.class.forName()
        Class class1=Class.forName("com.reflect.Person");
        System.out.println(class1);
        //2.类名.class
        Class class2=Person.class;
        System.out.println(class2);
        //2.类名.getClass()
        Class class3=new Person().getClass();
        System.out.println(class3);
        System.out.println(class1==class2);
        System.out.println(class2==class3);*/
        //获取对象
        Class tclass=Class.forName("com.reflect.Person");
        //通过类对象获取成员变量们
        Field[] fields = tclass.getDeclaredFields();
        System.out.println("获取Person对象的所有属性对象");
        for (Field field:fields){
           System.out.println(field);
       }
        //指定获取Person对象的属性对象
        System.out.println("指定获取Person对象的属性对象");
        Field age=tclass.getDeclaredField("age");
        System.out.println("age:"+age);
        //通过类对象获取所有的构造方法
        Constructor[] constructors = tclass.getDeclaredConstructors();
        System.out.println("获取Person的所有构造方法对象");
        for (Constructor constructor:constructors){
            System.out.println(constructor);
        }
        //通过类对象获取无参的构造方法
        Constructor constructor = tclass.getDeclaredConstructor();
        System.out.println("constructor:"+constructor);
        //通过类对象获取有参的构造方法
        Constructor constructor1 = tclass.getDeclaredConstructor(String.class,int.class);
        System.out.println("constructor1:"+constructor1);
        //通过类对象获取所有的成员方法
        Method[] methods = tclass.getDeclaredMethods();
        for (Method method:methods){
            System.out.println("method:"+method);
        }
        //通过类对象获取getAge成员方法
        Method getAge = tclass.getDeclaredMethod("getAge");
        System.out.println("getAge:"+getAge);
        //通过类对象获取getAge成员方法
        Method setAge = tclass.getDeclaredMethod("setAge", int.class);
        System.out.println("setAge:"+setAge);
    }
}
ログイン後にコピー

Get メンバー変数のコード例:

package com.reflect;
import java.lang.reflect.Field;
public class TestField {
    public static void main(String[] args) throws Exception {
        Class pcla=Person.class;
        /*//获取公共访问权限的成员变量
        Field[] fields = pcla.getFields();
        for (Field field:fields){
            System.out.println("getFild:"+field);
        }
        System.out.println();
        //获取所有访问权限的成员变量
        Field[] fielddes = pcla.getDeclaredFields();
        for (Field field:fielddes){
            System.out.println("field:"+field);
        }*/
        Field name = pcla.getDeclaredField("name");
        System.out.println(name);
        Person person=new Person();
        //暴力反射:获取任意访问权限修饰符的安全检查
        name.setAccessible(true);
        //获取公共成员变量的值
        Object value = name.get(person);
        System.out.println(value);
        //获取任意访问权限的成员变量的值
        Object value2 = name.get(person);
        System.out.println("value2:"+value2);
        //设置任意访问权限的成员变量的值
        name.set(person,"张三");
        Object value3=name.get(person);
        System.out.println("name:"+value3);
    }
}
ログイン後にコピー

プライベート変数の値を取得する方法Java リフレクション メカニズムに関する知識ポイントは何ですか?

//暴力反射:获取任意访问权限修饰符的安全检查
name.setAccessible(true);
ログイン後にコピー

メインメソッドの有無でプロセスやスレッドを判断する

プロセス: 独自のメインメソッドがあり、依存して起動できるこれはプロセスと呼ばれます

スレッド: 独自のメイン メソッドがなく、実行するには他のツールに依存する必要があります

例: サーブレットを実行する必要がありますTomcate には独自のメイン メソッドがあります

リフレクションの背景 (覚えておいてください)

例: サーブレットがツール tomcate を使用して実行されるとき、tomacate は実行できませんプロジェクトの実行時にクラスのリソースにアクセスするため、リフレクションが発生します。

tomcate が新しいオブジェクトを取得できない理由

#詳細な説明: tomcate は不可能です。tomacate が生成され、書き込まれているため、new を通じて呼び出されます。最初にクラスを記述し、後でクラスを記述するため、tomcate は new のオブジェクトが何であるかを知りません。パッケージ スキャンを通じてファイル パスを取得できますが、このように new を使用することはできず、リフレクションが発生します。

ate には独自の main メソッドがあります

リフレクションの背景

例: tomacate ツールを使用してサーブレットを実行する場合、tomacate はプロジェクトの実行時にクラスにアクセスできませんリソースが不足し、リフレクションが発生します。

Tomcate が新しいオブジェクトを取得できないのはなぜですか?

詳細な説明: Tomcate は最初に生成されて記述され、クラスは後で記述されるため、new 経由で Tomcate を呼び出すことはできません。そのため、tomcate は new のオブジェクトが何であるかを知りません。パッケージ スキャンを通じて呼び出すことができます。 . を使用してファイルパスを取得しますが、このメソッドでは new が使用できないため、リフレクションが発生します。

Tomcate が doGet メソッドと doPost メソッドを呼び出す必要がある場合、これら 2 つのメソッドは静的ではないため、新しいオブジェクトを通じて呼び出す必要がありますが、Tomcate はオブジェクトを作成できないため、ファイルを取得するためにリフレクションが生成されます

以上がJava リフレクション メカニズムに関する知識ポイントは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート