Javaでの反射メカニズム

11607 ワード

Javaでの反射メカニズム
1、Javaでの反射メカニズムとは?実行状態では、どのクラスに対しても、そのクラスの属性と方法を知ることができます.いずれのオブジェクトに対しても、彼の属性と方法を呼び出すことができます.このような動的に取得された情報および動的にオブジェクトメソッドを呼び出す機能をJavaの反射メカニズムと呼ぶ.
2、Javaの反射メカニズムは何の役に立ちますか?①運転時にいずれかの対象が属するクラスを判断する.②運転時に任意のクラスのオブジェクトを構築する.③実行時に任意のクラスが有するメンバー変数及び方法を判断する.④実行時に任意のオブジェクトを呼び出す方法;⑤動的エージェントを生成します.
3、関連API 1、完全なパッケージ名とクラス名を取得する``package cn.test.com;public class ReflectTest{
public static void main(String[] args) {
    ReflectTest reflectTest = new ReflectTest();
    System.out.println(reflectTest.getClass().getName());
    //  cn.test.com.ReflectTest
}

}
2,classオブジェクトのインスタンス化
package cn.test.com;
public class ReflectTest {

    public static void main(String[] args) {
        Class> clazz1 = null;
        Class> clazz2 = null;
        Class> clazz3 = null;
        try {
            clazz1 = Class.forName("cn.test.com.ReflectTest");//   
            clazz2 = new ReflectTest().getClass();
            clazz3 = ReflectTest.class;
            System.out.println("  1: "+clazz1.getName()+"   2: "
                    +clazz2.getName()+"   3: "+clazz3.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    //  
    //  1: cn.test.com.ReflectTest 
    //  2: cn.test.com.ReflectTest
    //  3: cn.test.com.ReflectTest
    }

3,親オブジェクトおよび実装インタフェースの取得
package cn.test.com;
import java.io.Serializable;
public class ReflectTest implements Serializable{

    public static void main(String[] args) {
        try {
            //  class  
            Class> clazz = Class.forName("cn.test.com.ReflectTest");
            //      
            Class> supperClass = clazz.getSuperclass();
            System.out.println("  : "+supperClass.getName());
            //  --->  : java.lang.Object
            //         
            Class>[] interfaces = clazz.getInterfaces();
            for(Class> inter : interfaces){
                System.out.println("   : "+inter.getName());
                //   : java.io.Serializable
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

4,classのすべてのコンストラクション関数を取得する
public static void main(String[] args) throws Exception {
        Class> clazz = null;
        clazz = Class.forName("cn.test.com.ReflectTest");
        //   :         ,  set  
        /*ReflectTest reflectTest = (ReflectTest) clazz.newInstance();
        reflectTest.setName("test");
        reflectTest.setAge(18);
        System.out.println("name: "+reflectTest.getName()+" age: "+reflectTest.getAge());
        */
        //   :         ,        
        Constructor>[] constructors = clazz.getConstructors();
        for(int i=0;i//            
            Class>[] parameterTypes = constructors[i].getParameterTypes();
            //      
            System.out.print("constructor:(");
            for(int j=0;j" ");
            }
            System.out.print(")");
            System.out.println();
            //constructor:()
            //constructor:(java.lang.String int )

        }
        ReflectTest reflectTest = (ReflectTest) constructors[1].newInstance("test",12);
        System.out.println(reflectTest);
        //ReflectTest [name=test, age=12]
    }

5,classクラスのすべての属性を取得する
public static void main(String[] args) throws Exception {
        Class> clazz = Class.forName("cn.test.com.ReflectTest");      
        /*-----------      --------------*/
        //      
        Field[] fields = clazz.getDeclaredFields();
        for(Field field:fields){
            //       
            int modifier = field.getModifiers();
            //       
            String modifierName = Modifier.toString(modifier);
            System.out.println("modifierName: "+modifierName);
            //      
            Class> type = field.getType();
            System.out.println(type.getName());
        }
        /*-----------          --------------*/
        Field[] supperFields = clazz.getFields();
        for(Field supperField : supperFields){
            int modifier = supperField.getModifiers();
            String modifierName = Modifier.toString(modifier);
            System.out.println("modifierName: "+modifierName);
            Class> type = supperField.getType();
            System.out.println(type.getName());
        }
    }

6,classのすべてのメソッドを取得する
public static void main(String[] args) throws Exception {
        Class> clazz = Class.forName("cn.test.com.ReflectTest");
        Method[] methods = clazz.getMethods();
        for(Method method : methods){
            //       
            Class> returnType = method.getReturnType();
            System.out.println("returnType: "+returnType.getName());
            //           
            Class>[] parameterTypes = method.getParameterTypes();
            //       
            int modifier = method.getModifiers();
            System.out.println(Modifier.toString(modifier));
            for(Class> parameterType : parameterTypes){
                System.out.print(parameterType.getName());
            }
            //          
            Class>[] exceptionTypes = method.getExceptionTypes();
            for(Class> exceptionType:exceptionTypes){
                System.out.println(exceptionType.getName());
            }
        }
    }

7,反射機構によりclassを呼び出す方法
public static void main(String[] args) throws Exception {
        Class> clazz = Class.forName("cn.test.com.ReflectTest");

        //         
        Method method = clazz.getMethod("toString");
        //    :           
        method.invoke(clazz.newInstance());

        Method method2 = clazz.getMethod("test",String.class);
        method2.invoke(clazz.newInstance(),"test");
        //                   
    }

4、反射メカニズムの応用反射メカニズムが最もよく見られるのはspringのファクトリモード、ダイナミックエージェント、およびプロファイルと組み合わせて使用することである.