反射的作用——獲取運行時類的所有東西,及其使用

一、獲取類的結構屬性。

@Test
    public void test1(){

        Class clazz = Person.class;

        //獲取屬性結構
        //getFields():獲取當前運行時類及其父類中聲明爲public訪問權限的屬性
        Field[] fields = clazz.getFields();
        for(Field f : fields){
            System.out.println(f);
        }
        System.out.println();

        //getDeclaredFields():獲取當前運行時類中聲明的所有屬性。(不包含父類中聲明的屬性)
        Field[] declaredFields = clazz.getDeclaredFields();
        for(Field f : declaredFields){
            System.out.println(f);
        }
    }

二、獲取類結構屬性的權限修飾符,數據類型,變量名。

    @Test
    public void test2(){
        Class clazz = Person.class;
        Field[] declaredFields = clazz.getDeclaredFields();
        for(Field f : declaredFields){
            //1.權限修飾符
            int modifier = f.getModifiers();
            System.out.print(Modifier.toString(modifier) + "\t");

            //2.數據類型
            Class type = f.getType();
            System.out.print(type.getName() + "\t");

            //3.變量名
            String fName = f.getName();
            System.out.print(fName);

            System.out.println();
        }
    }

 

三、獲取類結構屬性——具體方法。

    @Test
    public void test1(){

        Class clazz = Person.class;

        //getMethods():獲取當前運行時類及其所有父類中聲明爲public權限的方法
        Method[] methods = clazz.getMethods();
        for(Method m : methods){
            System.out.println(m);
        }
        System.out.println();
        //getDeclaredMethods():獲取當前運行時類中聲明的所有方法。(不包含父類中聲明的方法)
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for(Method m : declaredMethods){
            System.out.println(m);
        }
    }

四、獲取構造器結構

@Test
    public void test1(){

        Class clazz = Person.class;
        //getConstructors():獲取當前運行時類中聲明爲public的構造器
        Constructor[] constructors = clazz.getConstructors();
        for(Constructor c : constructors){
            System.out.println(c);
        }

        System.out.println();
        //getDeclaredConstructors():獲取當前運行時類中聲明的所有的構造器
        Constructor[] declaredConstructors = clazz.getDeclaredConstructors();
        for(Constructor c : declaredConstructors){
            System.out.println(c);
        }

    }

五、獲取運行時類的父類

    /*
    獲取運行時類的父類

     */
    @Test
    public void test2(){
        Class clazz = Person.class;

        Class superclass = clazz.getSuperclass();
        System.out.println(superclass);
    }

六、 獲取類的帶泛型的父類

    @Test
    public void test3(){
        Class clazz = Person.class;

        Type genericSuperclass = clazz.getGenericSuperclass();
        System.out.println(genericSuperclass);
    }

七、獲取類的帶泛型的父類的泛型

    @Test
    public void test4(){
        Class clazz = Person.class;

        Type genericSuperclass = clazz.getGenericSuperclass();
        ParameterizedType paramType = (ParameterizedType) genericSuperclass;
        //獲取泛型類型
        Type[] actualTypeArguments = paramType.getActualTypeArguments();
//        System.out.println(actualTypeArguments[0].getTypeName());
        System.out.println(((Class)actualTypeArguments[0]).getName());
    }

 八、獲取運行時類實現的接口

    /*
    獲取運行時類實現的接口
     */
    @Test
    public void test5(){
        Class clazz = Person.class;

        Class[] interfaces = clazz.getInterfaces();
        for(Class c : interfaces){
            System.out.println(c);
        }

        System.out.println();
        //獲取運行時類的父類實現的接口
        Class[] interfaces1 = clazz.getSuperclass().getInterfaces();
        for(Class c : interfaces1){
            System.out.println(c);
        }

    }

 九、獲取運行時類所在的包

    /*
        獲取運行時類所在的包
     */
    @Test
    public void test6(){
        Class clazz = Person.class;

        Package pack = clazz.getPackage();
        System.out.println(pack);
    }

十、獲取運行時類聲明的註解 

    /*
        獲取運行時類聲明的註解
     */
    @Test
    public void test7(){
        Class clazz = Person.class;

        Annotation[] annotations = clazz.getAnnotations();
        for(Annotation annos : annotations){
            System.out.println(annos);
        }
    }

 十一、調用運行時類中指定的結構:屬性、方法、構造器

  /*
    如何操作運行時類中的指定的屬性 -- 需要掌握
     */
    @Test
    public void testField1() throws Exception {
        Class clazz = Person.class;

        //創建運行時類的對象
        Person p = (Person) clazz.newInstance();

        //1. getDeclaredField(String fieldName):獲取運行時類中指定變量名的屬性
        Field name = clazz.getDeclaredField("name");

        //2.保證當前屬性是可訪問的
        name.setAccessible(true);
        //3.獲取、設置指定對象的此屬性值
        name.set(p,"Tom");

        System.out.println(name.get(p));
    }
 /*
    如何操作運行時類中的指定的方法 -- 需要掌握
     */
    @Test
    public void testMethod() throws Exception {

        Class clazz = Person.class;

        //創建運行時類的對象
        Person p = (Person) clazz.newInstance();

        /*
        1.獲取指定的某個方法
        getDeclaredMethod():參數1 :指明獲取的方法的名稱  參數2:指明獲取的方法的形參列表
         */
        Method show = clazz.getDeclaredMethod("show", String.class);
        //2.保證當前方法是可訪問的
        show.setAccessible(true);

        /*
        3. 調用方法的invoke():參數1:方法的調用者  參數2:給方法形參賦值的實參
        invoke()的返回值即爲對應類中調用的方法的返回值。
         */
        Object returnValue = show.invoke(p,"CHN"); //String nation = p.show("CHN");
        System.out.println(returnValue);

        System.out.println("*************如何調用靜態方法*****************");

        // private static void showDesc()

        Method showDesc = clazz.getDeclaredMethod("showDesc");
        showDesc.setAccessible(true);
        //如果調用的運行時類中的方法沒有返回值,則此invoke()返回null
//        Object returnVal = showDesc.invoke(null);
        Object returnVal = showDesc.invoke(Person.class);
        System.out.println(returnVal);//null

    }
    /*
    如何調用運行時類中的指定的構造器
     */
    @Test
    public void testConstructor() throws Exception {
        Class clazz = Person.class;

        //private Person(String name)
        /*
        1.獲取指定的構造器
        getDeclaredConstructor():參數:指明構造器的參數列表
         */

        Constructor constructor = clazz.getDeclaredConstructor(String.class);

        //2.保證此構造器是可訪問的
        constructor.setAccessible(true);

        //3.調用此構造器創建運行時類的對象
        Person per = (Person) constructor.newInstance("Tom");
        System.out.println(per);

    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章