Java反射メカニズムの概要


一、---概念---
(1)Java反射メカニズムとは
Javaのクラスはjava仮想マシンにロードされないと正常に動作しません.反射メカニズムは、コンパイル時にそのクラスが仮想マシンにロードされたかどうかは確定せず、実行中です.

の場合は一定の方法で探知します.
(2)Java反射メカニズムの役割
私たちは、オブジェクトに対して「自己確認」と「プローブ」を持つ能力を持っており、1つのオブジェクトのすべての方法と属性をユーザーが選択できるように羅列しています.
二、---Class類---
(1)Classクラスの簡単な紹介
Java反射メカニズムを正しく使用するにはjava.lang.Classというクラスを使用します.Java反射メカニズムの起源です.クラスがロードされるとJava仮想マシンは自動的に
Classオブジェクトを生成します.このクラスオブジェクトを使用すると、仮想マシンにロードされたクラスオブジェクトに対応するメソッド、メンバー、および構築メソッドの宣言や定義などの情報を取得できます.
(2)Classクラスの深さ
Classクラスはオブジェクトとインタフェースの実行時の状態をカプセル化し、クラスをロードすると自動的にClassタイプのオブジェクトが作成されます. Classには共通の構造方法はありません. 仮想マシンは、クラスごとにユニークなClassオブジェクトを管理します.つまりクラスごとにクラスオブジェクトが1つずつ存在する.プログラムを実行すると、Java仮想マシン(JVM)はまず、ロードするクラスに対応するClassオブジェクトがロードされているかどうかを確認します.ロードされていない場合、JVMはクラス名に基づいて.classファイルを検索し、Classオブジェクトをロードします.       基本的なJavaタイプ(boolean、byte、char、short、int、long、float、double)とキーワードvoidもクラスオブジェクトに対応しています.
三、---実例分析---
3.1実現機能
(1)反射機構によるクラスのパケット名とクラス名
(2)すべてのクラスがクラスのインスタンスオブジェクトである.
(3)Classクラスによるオブジェクトの作成
(4)クラスのコンストラクタを取得し,オブジェクトをインスタンス化する.
(5)反射機構操作メンバー変数
(6)取得クラスの属性(親クラス、実装インタフェース、関数、タイプ)
(7)反射機構によるクラス呼び出しの方法
(8)反射機構によるクラスローダの獲得
3.2コード実装(コードは転載大神のもの)
(0)まずPersonとそのサブクラスSuperManクラスを作成する
class  Person{  
    private int age;  
    private String name;  
    public Person(){  
          
    }  
    public Person(int age, String name){  
        this.age = age;  
        this.name = name;  
    }  
  
    public int getAge() {  
        return age;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
}  
  
class SuperMan extends Person implements ActionInterface  
{  
    private boolean BlueBriefs;  
      
    public void fly()  
    {  
        System.out.println("    ");  
    }  
      
    public boolean isBlueBriefs() {  
        return BlueBriefs;  
    }  
    public void setBlueBriefs(boolean blueBriefs) {  
        BlueBriefs = blueBriefs;  
    }  
  
    @Override  
    public void walk(int m) {  
 
        System.out.println("     ~~  " + m + "      !");  
    }  
}  
interface ActionInterface{  
    public void walk(int m);  
}  

(1)反射機構によるクラスのパケット名とクラス名
    /** 
     * Demo1:   Java              
     */  
    public static void Demo1()  
    {  
        Person person = new Person();  
        System.out.println("Demo1:   : " + person.getClass().getPackage().getName() + ","   
                + "    : " + person.getClass().getName());  
    } 

(2)すべてのクラスがクラスのインスタンスオブジェクトである.
    /** 
     * Demo2:         Class       
     * @throws ClassNotFoundException  
     */  
    public static void Demo2() throws ClassNotFoundException  
    {  
        //          Class ,      null,           Person   
        Class<?> class1 = null;  
        Class<?> class2 = null;  
          
        //  1,      ClassNotFoundException [      ]  
        class1 = Class.forName("cn.lee.demo.Person");  
        System.out.println("Demo2:(  1)   : " + class1.getPackage().getName() + ","   
                + "    : " + class1.getName());  
          
        //  2  
        class2 = Person.class;  
        System.out.println("Demo2:(  2)   : " + class2.getPackage().getName() + ","   
                + "    : " + class2.getName());  
    }

(3)Classクラスによるオブジェクトの作成
    /** 
     * Demo3:   Java    , Class      [             ] 
     * @throws ClassNotFoundException  
     * @throws IllegalAccessException  
     * @throws InstantiationException  
     */  
    public static void Demo3() throws ClassNotFoundException, InstantiationException, IllegalAccessException  
    {  
        Class<?> class1 = null;  
        class1 = Class.forName("cn.lee.demo.Person");  
        //         ,           Person,           ~  
        Person person = (Person) class1.newInstance();  
        person.setAge(20);  
        person.setName("LeeFeng");  
        System.out.println("Demo3: " + person.getName() + " : " + person.getAge());  
    } 

(4)クラスのコンストラクタを取得し,オブジェクトをインスタンス化する.
    /** 
     * Demo4:   Java              ,            
     * @throws ClassNotFoundException  
     * @throws InvocationTargetException  
     * @throws IllegalAccessException  
     * @throws InstantiationException  
     * @throws IllegalArgumentException  
     */  
    public static void Demo4() throws ClassNotFoundException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException  
    {  
        Class<?> class1 = null;  
        Person person1 = null;  
        Person person2 = null;  
          
        class1 = Class.forName("cn.lee.demo.Person");  
        //             
        Constructor<?>[] constructors = class1.getConstructors();  
          
        person1 = (Person) constructors[0].newInstance();  
        person1.setAge(30);  
        person1.setName("leeFeng");  
          
        person2 = (Person) constructors[1].newInstance(20,"leeFeng");  
          
        System.out.println("Demo4: " + person1.getName() + " : " + person1.getAge()  
                + "  ,   " + person2.getName() + " : " + person2.getAge()  
                );  
          
    }

(5)反射機構操作メンバー変数
    /** 
     * Demo5:   Java          , set   get 
     *  
     * @throws IllegalAccessException  
     * @throws IllegalArgumentException  
     * @throws NoSuchFieldException  
     * @throws SecurityException  
     * @throws InstantiationException  
     * @throws ClassNotFoundException  
     */  
    public static void Demo5() throws IllegalArgumentException, IllegalAccessException, SecurityException, NoSuchFieldException, InstantiationException, ClassNotFoundException  
    {  
        Class<?> class1 = null;  
        class1 = Class.forName("cn.lee.demo.Person");  
        Object obj = class1.newInstance();  
          
        Field personNameField = class1.getDeclaredField("name");  
        personNameField.setAccessible(true);  
        personNameField.set(obj, "    ");  
          
          
        System.out.println("Demo5:               :" + personNameField.get(obj));  
          
    }  

(6)取得クラスの属性(親クラス、実装インタフェース、関数、タイプ)
   /** 
     * Demo6:   Java            :      ,  ,    ,    ,    
     * @throws ClassNotFoundException  
     */  
    public static void Demo6() throws ClassNotFoundException  
    {  
        Class<?> class1 = null;  
        class1 = Class.forName("cn.lee.demo.SuperMan");  
          
        //        
        Class<?>  superClass = class1.getSuperclass();  
        System.out.println("Demo6:  SuperMan     : " + superClass.getName());  
          
        System.out.println("===============================================");  
          
          
        Field[] fields = class1.getDeclaredFields();  
        for (int i = 0; i < fields.length; i++) {  
            System.out.println("     : " + fields[i]);  
        }  
        System.out.println("===============================================");  
          
          
        //       
        Method[] methods = class1.getDeclaredMethods();  
        for (int i = 0; i < methods.length; i++) {  
            System.out.println("Demo6,  SuperMan    :");  
            System.out.println("   :" + methods[i].getName());  
            System.out.println("      :" + methods[i].getReturnType());  
            System.out.println("       :" + Modifier.toString(methods[i].getModifiers()));  
            System.out.println("      : " + methods[i]);  
        }  
          
        System.out.println("===============================================");  
          
        //        ,        Class,                      
        Class<?> interfaces[] = class1.getInterfaces();  
        for (int i = 0; i < interfaces.length; i++) {  
            System.out.println("       : " + interfaces[i].getName() );  
        }  
          
    } 

(7)反射機構によるクラス呼び出しの方法
    /** 
     * Demo7:   Java          
     * @throws ClassNotFoundException  
     * @throws NoSuchMethodException  
     * @throws SecurityException  
     * @throws InvocationTargetException  
     * @throws IllegalAccessException  
     * @throws IllegalArgumentException  
     * @throws InstantiationException  
     */  
    public static void Demo7() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, InstantiationException  
    {  
        Class<?> class1 = null;  
        class1 = Class.forName("cn.lee.demo.SuperMan");  
          
        System.out.println("Demo7: 
fly():"); Method method = class1.getMethod("fly"); method.invoke(class1.newInstance()); System.out.println(" walk(int m):"); method = class1.getMethod("walk",int.class); method.invoke(class1.newInstance(),100); }

(8)反射機構によるクラスローダの獲得
    /** 
     * Demo8:   Java             
     *  
     *  java         。[        ] 
 
        1)Bootstrap ClassLoader       c++  ,        。 
 
        2)Extension ClassLoader           ,      jre\lib\ext      
 
        3)AppClassLoader   classpath    ,        。    java       。 
     *  
     * @throws ClassNotFoundException  
     */  
    public static void Demo8() throws ClassNotFoundException  
    {  
        Class<?> class1 = null;  
        class1 = Class.forName("cn.lee.demo.SuperMan");  
        String nameString = class1.getClassLoader().getClass().getName();  
          
        System.out.println("Demo8:       : " + nameString);  
    }  

また、対応するヘッダファイルが含まれているか、正常に使用できないかを覚えておいてください.
作者を尊重し、オリジナルを尊重し、文章を参考にする.
http://blog.csdn.net/ljphhj/article/details/12858767
http://www.cnblogs.com/chenliang901114/archive/2013/04/23/javalearner.html
http://lavasoft.blog.51cto.com/62575/15433/