反射機制詳解下篇


java的反射機制一共分爲上下兩篇,上篇請參考:http://xinsz08.blog.51cto.com/10565212/1946912

下篇主要講解:

      1.利用反射技術獲取構造方法,並使用構造方法創建對象

      2.使用反射技術快速創建對象

      3.使用反射技術獲取成員方法,並執行方法

      4.反射技術小結.


1.使用反射技術獲取構造方法,並使用構造方法創建對象

  實現步驟:

   1.獲取class文件對象 (Class.forName)

   2.使用class文件對象中的方法,解剖class文件獲取構造方法Constructor

   3.使用構造方法Constructor中的方法newInstance執行構造方法創建對象


  使用反射能夠獲取的構造方法:(首先建立一個Person類,用於測試,見代碼實例1)

* public Person()   無參構造方法

* public Person(String name, int age, String sex)  全參構造方法

* private Person(String name, int age)  私有構造方法



代碼實例1-創建Person 類:

package cn.xins08.boke;

public class Person {
    private String name;
    private int age;
    public String sex;

    static {
        System.out.println("靜態代碼塊");
    }

    // 3.無參的構造方法
    public Person() {
        super();
        System.out.println("無參構造方法");
    }

    public Person(String name, int age, String sex) {
        super();
        this.name = name;
        this.age = age;
        this.sex = sex;
        System.out.println("滿參數構造方法");
    }

    private Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
        System.out.println("私有的構造方法");
    }

    // 4.toString方法
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
    }

    private void method() {
        System.out.println("私有的method方法");
    }

    // 2.公共的setter/getter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

}

2.利用反射技術獲取Person類的構造方法及創建對象:

代碼實例2:


package cn.xins08.boke;

import java.lang.reflect.Constructor;

import cn.xins08.boke.Person;

public class ReflectConstructor {

    public static void main(String[] args) throws Exception {
        //1.獲取class文件對象
        Class clazz = Class.forName("cn.xins08.boke.Person");
        // 2.使用class文件對象中的方法,獲取class文件構造方法
        Constructor[] cons1 = clazz.getConstructors();
        // 獲取多個需要用getConstructors,前面用Constructor[]數組來接收.
        // 獲取一個用Constructor[] cons =clazz.getConstructor(); 只有一個就無需遍歷
        for (Constructor con : cons1) {

            System.out.println(con);
        }
        System.out.println("-------------------------------");
        Constructor[] cons2 = clazz.getDeclaredConstructors();
        for(Constructor con:cons2){
            System.out.println(con);
        }
        
       //3.使用構造方法Constructor中的方法newInstacnce執行構造方法創建對象
        Constructor con1 = clazz.getConstructor();
        Object obj1=con1.newInstance();
        System.out.println(obj1);//無參構造方法 Person [name=null, age=0, sex=null]
        Person p1=(Person) obj1;
        p1.setName("xinsz08");
        System.out.println(p1);//Person [name=xinsz08, age=0, sex=null]   
        
    }

}

運行結果:

靜態代碼塊

public cn.xins08.boke.Person()

public cn.xins08.boke.Person(java.lang.String,int,java.lang.String)

-------------------------------

public cn.xins08.boke.Person()

public cn.xins08.boke.Person(java.lang.String,int,java.lang.String)

private cn.xins08.boke.Person(java.lang.String,int)  (私有方法)

無參構造方法

Person [name=null, age=0, sex=null]

Person [name=xinsz08, age=0, sex=null] 




3.使用反射技術快速創建對象(重點)


    使用反射技術快速創建對象的前提:

  1. Person類中必須有無參構造方法

  2. 構造方法的修飾符不能是私有,建議使用public,因爲public的權重比較高.

  3. 只針對無參構造

    原理:使用class類中的方法 newInstance() ,創建此對象所表示的類的一個新實例.


代碼實例3:


package cn.xins08.boke;

public class Reflect_3 {

    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("cn.xins08.boke.Person");
        Object obj = clazz.newInstance();
        System.out.println(obj);
    }

}


運行結果:

靜態代碼塊
無參構造方法
Person [name=null, age=0, sex=null]


4.使用反射技術獲取成員方法,並執行方法(重點):

   實現步驟:

    1.獲取類的class文件對象

    2.使用class文件對象中的方法,獲取Method

   method 有兩個方法:

  1. Method[] getMethods()  返回公共的成員方法,包括繼承自父類的,重寫接口的方法

  2. Method[] getDeclaredMethods() 包括公共、保護、默認(包)訪問和私有方法,但不包括繼承的方法


    代碼實例4:


package cn.xins08.boke;

import java.lang.reflect.Method;

public class ReflectMethod {

    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("cn.xins08.boke.Person");
        // 使用class 文件對象中的方法獲取method
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method);
             // 能夠返回公共,默認訪問和私有方法,但是獲取不到繼承的方法

        }
        System.out.println("======我是分割線==============");
       

        Method[] methodsD = clazz.getDeclaredMethods();
        for (Method method : methodsD) {
            System.out.println(method);//

        }

        Object obj = clazz.newInstance();
        Method getNameMethod = clazz.getMethod("getName");
        System.out.println(getNameMethod);
        /*
         * 無參構造方法 public java.lang.String cn.xins08.boke.Person.getName()
         */
        Object m1 = getNameMethod.invoke(obj);
        System.out.println(m1);
        
        Method setNameMethod = clazz.getMethod("setName", String.class);
        Object m2 =setNameMethod.invoke(obj, "xinsz08");
        System.out.println(m2);
        //此處的setName 沒有返回值,因爲返回類型爲void.所以m2的值爲null
        //我們再次獲取name的值
        m1=getNameMethod.invoke(obj);
        System.out.println(m1); //此時打印的就是xinsz08
    }

}


反射機制小結:


  1. 利用反射機制獲取Class文件對象:

三種方式:

  1.   通過Object getClass()方法獲取 Class對象

  2.  通過類名.class 方式 獲取 Class對象

  3.  通過反射的方式, Class.forName(String classname) 獲取Class對象

               


      2.通過反射, 獲取類中的構造方法,並完成對象的創建.

               獲取指定的構造方法

                public Constructor<T> getConstructor(Class<?>... parameterTypes)

                獲取指定的public修飾的構造方法

                  public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)

                 獲取指定的構造方法,包含私有的

                 獲取所有的構造方法:

                 public Constructor<?>[] getConstructors() 獲取所有的public 修飾的構造方法

                 public Constructor<?>[] getDeclaredConstructors() 獲取所有的構造方法,包含私有的

 

    3. 通過反射獲取類中的構造方法,並完成對象的創建:

              基本步驟:

                1.獲取字節碼文件對象

                2.通過字節碼文件對象 ,獲取到指定的構造方法

                         getConstructor(參數);

                3.通過構造方法,創建對象

                         public T newInstance(Object... initargs)

 

                  私有構造方法,創建對象

               1. 獲取字節碼文件對象

                2. 通過字節碼文件對象 ,獲取到指定的構造方法

                         getDeclaredConstructor (參數);

              

                3.通過構造方法,創建對象

                         public T newInstance(Object... initargs)

 

    4.通過反射,獲取Class文件中的方法


                獲取指定的方法

                         public Method getMethod(String name, Class<?>... parameterTypes)

                 獲取指定的public方法

                         public Method getDeclaredMethod(String name, Class<?>... parameterTypes)

                                   獲取指定的任意方法,包含私有的


                 獲取所有的方法

                         public Method[] getMethods() 獲取本類與父類中所有public 修飾的方法

                         ublic Method[] getDeclaredMethods()獲取本類中所有的方法,包含私有的

        

           通過反射,調用方法

              基本步驟:

               1.獲取Class對象

               2.獲取構造方法,創建對象

               3.獲取指定的public方法

               4.執行方法     

                    

 


  


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