Javaのリフレクションロードプロセス、クラスとクラスローダクラスローダ

まず、カスタムクラス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(); 
    } 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/zsben991126/p/11888613.html