java 27 - 3 反射之 通過反射獲取構造方法並使用


類 Constructor<T>:提供關於類的單個構造方法的信息以及對它的訪問權限。

 

通過反射的方法獲取構造方法並使用  ps:先忽略泛型

  A.1:獲取構造方法的數組:

    public Constructor<?>[] getConstructors():獲得所有公共構造方法

    public Constructor<?>[] getDeclaredConstructors():獲得所有構造方法

  A.2:獲取單個構造方法(用於非私有的構造方法)

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

      參數表示的是:你要獲取的構造方法的構造參數個數及數據類型的class字節碼文件對象

  A.3:獲取單個構造方法(用於私有的構造方法)

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

  B.1:初始化構造方法的實例:(用於非私有的構造方法)

    public T newInstance(Object... initargs)  注意:T表示的是泛型,Object... initargs表示的是你要實例化的指定參數

      使用此 Constructor對象表示的構造方法來創建該構造方法的聲明類的新實例,並用指定的初始化參數初始化該實例。

  B.2:初始化構造方法的實例:(用於私有的構造方法)   

   先用: public void setAccessible(boolean flag):flag的值為 true 則指示反射的對象在使用時應該取消 Java 語言訪問檢查。

   再用: public T newInstance(Object... initargs) 

代碼:

  A:public Constructor<?>[] getConstructors():獲得所有公共構造方法

1         Constructor[] c1 = c.getConstructors();
2         System.out.println(c1);// 返回的是地址值,證明得到的是個數組對象
3         // 遍歷這個數組
4         for (Constructor ct : c1) {
5             System.out.println(ct);
6         }  //獲得Person類中的所有公告構造方法

 

  B:public Constructor<?>[] getDeclaredConstructors():獲得所有構造方法

1         // B:public Constructor<?>[] getDeclaredConstructors():獲得所有構造方法
2          Constructor[] c1 = c.getDeclaredConstructors();
3          //遍歷數組
4          for(Constructor ct : c1){
5              System.out.println(ct);
6          } //獲得Person類的所有構造方法

  

  C:public Constructor<T> getConstructor(Class<?>... parameterTypes):獲得指定的構造方法

獲得無參構造方法: 

1         Constructor c1 = c.getDeclaredConstructor();
2         System.out.println(c1);

 

獲得帶參構造方法:

1         //獲取指定的構造方法,需要該方法的參數列表
2         Constructor c1 = c.getDeclaredConstructor(String.class,int.class,String.class);
3         System.out.println(c1);

 

  D:public T newInstance(Object... initargs)  注意:T表示的是泛型,Object... initargs表示的是你要實例化的指定參數

    使用此 Constructor對象表示的構造方法來創建該構造方法的聲明類的新實例,並用指定的初始化參數初始化該實例。

     也就是初始化對象

 

通過反射獲取公共帶參構造方法並使用:

1         //獲取指定的構造方法,需要該方法的參數列表
2         Constructor c1 = c.getDeclaredConstructor(String.class,int.class,String.class);
3         System.out.println(c1);
4         
5         // 通過帶參構造方法對象創建對象
6         // public T newInstance(Object... initargs):
7         //有泛型,前面沒使用泛型,先用Objcet
8         Object b = c1.newInstance("張三",13,"家鄉");
9         System.out.println(b); //Person [name=張三, age=13, address=家鄉]

 

通過反射獲取私有帶參構造方法並使用:

 1         //獲取指定的私有構造方法
 2         Constructor c1 = c.getDeclaredConstructor(String.class);
 3         
 4         //public void setAccessible(boolean flag):
 5         //flag的值為 true 則指示反射的對象在使用時應該取消 Java 語言訪問檢查。
 6         c1.setAccessible(true);
 7         
 8         // public T newInstance(Object... initargs) 
 9         Object ob = c1.newInstance("張三");
10         System.out.println(ob);

 

后兩個代碼,相當於以前的: 只不過通過反射,不需要導入對應的類

1 public Person(String name, int age, String address)
2  
3  Person p = new Person("張三",13,"家鄉");
4  System.out.println(p);

1  private Person(String name){}
2 
3  Person p = new Person("風清揚");
4  System.out.println(p);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM