まず、カスタムクラスPerson
パッケージの反射。 パブリック クラス人{ プライベート文字列名; 公共 int型の年齢; パブリック文字列のgetName(){ 戻り名。 } 公共 ボイドのsetName(文字列名){ この .nameの= 名前。 } 公共 INT getAge(){ 戻り年齢; } 公共 ボイド setAge(int型の年齢){ この .age = 年齢。 } @Override 公衆文字列のtoString(){ 戻り "人物[NAME =" +名+ "年齢=" +年齢+ "]" 。 } 公共パーソン(文字列名、int型の年齢){ スーパー(); この .nameの= 名前; この .age = 年齢; } パブリック人(){ スーパー()。 } 公共人(文字列名){ スーパー()。 この .nameの= 名前; } 公共 ボイドショー(){ System.out.printlnは( "我是一个人" )。 } プライベート文字列showNation(文字列ネーション){ するSystem.out.println( "国" + ネーション); 戻りネーション; } }
次いで、操作の一部は、反射しました
パッケージの反射。 輸入java.io.FileInputStream; 輸入java.io.FileNotFoundException。 輸入java.lang.reflect.Constructor; インポートをjava.lang.reflect.Field; インポートにjava.lang.reflect.InvocationTargetException; 輸入java.lang.reflect.Methodオブジェクト; 輸入java.util.Properties; 輸入org.junit.jupiter.api.Test; パブリック クラスReflectionTest { @Test 公共 のボイド TEST1()はスロー例外{ 人物P1 = 新しい人( "トム"、12 ); //1.反射、人クラスのオブジェクトを作成する クラスclazz =人。クラス、 コンストラクタ短所 = clazz.getDeclaredConstructor(文字列クラス、INT。クラス); オブジェクトOBJ = cons.newInstance( "トム"、12である); 者P = (人物)OBJ; のSystem.out.println(p.toString()); // 2.指定された属性と呼ばれる物体によって反射さ フィールド、clazz.getDeclaredField年齢=( "年齢" ); age.set(P、 10 ) ; のSystem.out.println(p.toString()); // 呼び出しメソッドによって反射3. 方法ショー= clazz.getDeclaredMethod( "ショー"); Show.invoke(P-); のSystem.out.println(「********************************** ********************************************************** " ); } / * *プライベートメソッドとプロパティを呼び出すための反射 * * / @Test 公共 ボイド TEST2()スロー{例外 トライ{ // 反射プライベートメソッドとプロパティによって呼び出される 。人clazz =クラスクラス; // 1.プライベートコンストラクタを呼び出す コンストラクタcons1 clazz.getDeclaredConstructor =(文字列クラス;) cons1.setAccessible(trueに)。 人物人物 =(人物)cons1.newInstance( "zsben" ); System.out.println(人)。 // 2.调用私有属性 フィールド名= clazz.getDeclaredField( "名前" ); name.setAccessible(真の); name.set(人、 "Lilei" ); System.out.println(人)。 // 3.调用私有方法 方法showNation = clazz.getDeclaredMethod( "showNation"、文字列。クラス)。 showNation.setAccessible(真の); showNation.invoke(人、 "中国" )。 // 4。 文字列=(String)をshowNation.invoke(人、 " 中国" ); System.out.printlnは(文字列); } キャッチ(例外E){ e.printStackTrace(); } } / * クラスクラスの理解 * 1積載クラス:java.exeを解釈し、実行中のバイトコード・コマンド・ファイル使用して ロードされたクラスと呼ばれるメモリにロードされたバイトコードファイルに*対応は、クラスは、メモリにロードされますランタイムクラスと呼ばれる クラスに、このランタイムクラスは、例として* ランタイムクラスに2.Classの対応の例* * 3ランタイムクラスがメモリにロードされ、一定期間内にキャッシュ、我々このランタイムクラスは、さまざまな方法で取得することができます * * * / / * *クラスのインスタンスを取得する4つの方法 * * / @Test 公衆 空 Test3は()がスローClassNotFoundExceptionが{ // 実施例1:ランタイムクラス属性を呼び出し、バックのないクラスは、一般的なことがあり 、クラス<人> = clazz1の人。クラス; (clazz1の)のSystem.out.println; // 方法2 :オブジェクトが同じように実行される 人物P1 = 新しい新しい人(); クラスclazz2 = p1.getClass(); System.out.printlnは(clazz2); // モード3:(文字列クラスパス)クラスの静的メソッドを呼び出すにforName、クラスパスパスクラス クラス= clazz3 Class.forNameの( "reflection.Person" ); のSystem.out.println(clazz3); // 実施例4クラスローダ のClassLoaderクラスローダ= ReflectionTest。クラス.getClassLoader(); classLoader.loadClass( "reflection.Person" ); クラスclazz4 = classLoader.loadClass( "reflection.Person" ); System.out.println(clazz1 == clazz2)。 System.out.println(clazz1 == clazz3)。 System.out.println(clazz1 == clazz4)。 } }
クラスローダは大歓迎します
パッケージリフレクション; インポートjava.io.FileInputStream; インポートするjava.io.InputStream; インポートjava.util.Properties; インポートorg.junit.jupiter.api.Test; / * *クラスをロードする: *クラス1負荷:クラスのクラスファイルがクラスオブジェクトを作成するために、メモリに読み込まれ、誰され、このプロセスは、クラスローダによって完成された * 2クラスのリンク:静的変数(0、ヌルのデフォルト値を設定し、JREへのバイナリデータのクラスをマージします、「」、等) * 3クラスの初期化:JVMは、コード割り当ての静的ブロックを行う、初期化の原因である配列およびクラス属性で実行 * * * / / * *クラスローダが理解 * * * / パブリック クラスClassLoaderTest { @Test 公共 のボイドTEST1(){ //カスタムクラスは、クラスローダClassLoaderTestを得た:システムクラスローダ、すなわち、システムクラスローダ属する 。クラスローダ= ClassLoaderTestのClassLoader クラス; .getClassLoader() のSystem.out.println(ClassLoaderを); // システムクラスローダのgetParent呼び出し()クラスローダ、即ち拡張クラスローダ得拡張 のClassLoader classLoader2 = ClassLoader.getParent(); のSystem.out.println(classLoader2); // Bootstapコアクラスライブラリをロードする責任クラスローダJava(登録商標)、ない クラスローダclassLoader3 = classLoader2.getParent (); のSystem.out.println(classLoader3); // および3は同様に、文字列は、コアのJavaライブラリである 。クラスローダclassLoader4 =ストリングクラス .getClassLoader()。 System.out.println(classLoader4)。 } // 读取读取配置文件 @Test 公共 ボイド TEST4()スロー例外{ // 方式1人の プロパティプロ= 新しいプロパティ(); FileInputStreamのFIS = 新しい FileInputStreamを( "jdbc.properties" ); pros.load(FIS)。 文字列ユーザ = pros.getProperty(「ユーザ」)。 文字列のpasswd = pros.getProperty( "パスワード" ); System.out.println(ユーザー + のpasswd)。 } }
反射によってオブジェクトを作成するためのランタイムクラス
パッケージリフレクション; インポートorg.junit.jupiter.api.Test; / * *反射によってランタイム・クラスに対応するオブジェクトを作成する * * / パブリック クラスNewInstanceTest { @Test 公共 ボイド TEST1()がスローないInstantiationExceptionが、IllegalAccessExceptionがある{ // インスタンス化異常、異常な権限 クラスの<person> = clazz人。クラス、 オブジェクトオブジェクト = clazz.newInstance(); のSystem.out.println(オブジェクト); / * *のnewInstance()ランタイム・クラスに対応するオブジェクトを作成する *内部コールnullのコンストラクタのパラメータ * * / 人人Clazz.newInstanceは=(); // ここで直接実行時クラス・オブジェクト・クラスの人を得ることができる 。のSystem.out.println(人) } @Test 公共 ボイド TEST2()スローないInstantiationExceptionは、IllegalAccessExceptionが{で、ClassNotFoundExceptionが のclassPath文字列 = "" ; クラスパス = "java.util.Date" ; のSystem.out.println(のgetInstance(のclassPath)); のclassPath = "reflection.Person" ; のSystem.out.println(のgetInstance(クラスパス)); } // このメソッドは、指定された全体を作成しますクラス名の例 パブリックオブジェクトのgetInstance(文字列クラスパスが)スローClassNotFoundExceptionが、ないInstantiationException、IllegalAccessExceptionが{ クラスclazz = Class.forNameの(のclassPath)。 リターンclazz.newInstance(); } }