Java ソース コード----->javac-------------->Java バイトコード ファイル----- --- ------>java------>クラスオブジェクト(メモリ空間:メタスペース、ローカルメモリ)---------- ----- -------------新規-------->インスタンス化されたオブジェクト---- -gc---- -------->オブジェクトのアンロード
##クラス オブジェクトはさまざまな段階で取得できます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 の関数
//获得构造方法对象, 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、
コード例:
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); } }
プライベート変数の値を取得する方法
//暴力反射:获取任意访问权限修饰符的安全检查 name.setAccessible(true);メインメソッドの有無でプロセスやスレッドを判断するプロセス: 独自のメインメソッドがあり、依存して起動できるこれはプロセスと呼ばれますスレッド: 独自のメイン メソッドがなく、実行するには他のツールに依存する必要があります例: サーブレットを実行する必要がありますTomcate には独自のメイン メソッドがありますリフレクションの背景 (覚えておいてください)例: サーブレットがツール tomcate を使用して実行されるとき、tomacate は実行できませんプロジェクトの実行時にクラスのリソースにアクセスするため、リフレクションが発生します。 tomcate が新しいオブジェクトを取得できない理由
#詳細な説明: tomcate は不可能です。tomacate が生成され、書き込まれているため、new を通じて呼び出されます。最初にクラスを記述し、後でクラスを記述するため、tomcate は new のオブジェクトが何であるかを知りません。パッケージ スキャンを通じてファイル パスを取得できますが、このように new を使用することはできず、リフレクションが発生します。
リフレクションの背景
例: tomacate ツールを使用してサーブレットを実行する場合、tomacate はプロジェクトの実行時にクラスにアクセスできませんリソースが不足し、リフレクションが発生します。
Tomcate が新しいオブジェクトを取得できないのはなぜですか?
詳細な説明: Tomcate は最初に生成されて記述され、クラスは後で記述されるため、new 経由で Tomcate を呼び出すことはできません。そのため、tomcate は new のオブジェクトが何であるかを知りません。パッケージ スキャンを通じて呼び出すことができます。 . を使用してファイルパスを取得しますが、このメソッドでは new が使用できないため、リフレクションが発生します。
以上がJava リフレクション メカニズムに関する知識ポイントは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。