反射機制

    想研究下web框架如spring,struts的原理,但又不知從何看起,就想先研究一下反射機制,有大牛看到的話還請指點一下,我先此致敬禮了1001java

   所謂的反射機制就是java語言在運行時擁有一項自觀的能力,經過這種能力能夠完全的瞭解自身的狀況爲下一步的動做作準備。聽說這回顛覆對java的理解。。。web

    方法總結以下:spring

   Java類反射中的主要方法 對於如下三類組件中的任何一類來講 -- 構造函數、字段和方法 -- java.lang.Class 提供四種獨立的反射調用,以不一樣的方式來得到信息。數組

    調用都遵循一種標準格式。如下是用於查找構造函數的一組反射調用: 框架

    Constructor getConstructor(Class[] params) -- 得到使用特殊的參數類型的公共構造函數, Constructor[] getConstructors() -- 得到類的全部公共構造函數ide

    Constructor getDeclaredConstructor(Class[] params) -- 得到使用特定參數類型的構造函數(與接入級別無關) 函數

    Constructor[] getDeclaredConstructors() -- 得到類的全部構造函數(與接入級別無關)ui

得到字段信息的Class 反射調用不一樣於那些用於接入構造函數的調用,在參數類型數組中使用了字段名: this

    Field getField(String name) -- 得到命名的公共字段 spa

    Field[] getFields() -- 得到類的全部公共字段

    Field getDeclaredField(String name) -- 得到類聲明的命名的字段

    Field[] getDeclaredFields() -- 得到類聲明的全部字段

用於得到方法信息函數:

    Method getMethod(String name, Class[] params) -- 使用特定的參數類型,得到命名的公共方法

    Method[] getMethods() -- 得到類的全部公共方法

    Method getDeclaredMethod(String name, Class[] params) -- 使用特寫的參數類型,得到類聲明的命名的方法

    Method[] getDeclaredMethods() -- 得到類聲明的全部方法

 

               開始實例:

               假設咱們有一個類:

package yui;
 
 public class Role {
     
     private String name;
     private String type;
     
     // Constructors
     public Role(){
         System.out.println("Constructor Role() is invoking");
     }
     //私有構造器
     private Role(String name){
         this.name = name;
         System.out.println("Constructor Role(String name) is invoking.");
     }
     
     //get and set method
     
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this.name = name;
     }
     public String getType() {
         return type;
     }
     public void setType(String type) {
         this.type = type;
     }
     
     //override the toString method to show the class
     @Override
     public String toString(){
         return "This is a role called "+this.name;
     }
     
 }

               在沒有對象實例的時候,主要有兩種辦法。

Class cls1 = Role.class;
Class cls2 = Class.forName("yui.Role");//(yui是包名,Role是類名)
獲取類的構造器:
Object o=cls1.newInstance();//建立一個實例
//Object o1=new Role();//與上面的方法等價
可是直接動過class得到的建立的實例的時候咱們只能使用默認構造函數,由於Class的newInstance
是不接受參數的,且若是類的構造函數是private的,好比Class(的確,class中的構造函數
是private的),咱們仍舊不能實例化其對象。而用Constructor類用來封裝反射獲得的構造器,就能夠
調用私有構造器了。

                獲取類的構造器(感受仍是從下面的代碼才理解了反射機制的做用):

 /** * 獲取構造方法Constructor * getConstructor() only for public * getDeclaredConstructor() global access all * * */
         
         //指定參數列表獲取特定的方法
         Constructor con = cls1.getDeclaredConstructor(new Class[]{String.class});
         con.setAccessible(true); //設置可訪問的權限
         Object obj = con.newInstance(new Object[]{"liyang"});
         System.out.println(obj);  //打印一下這個對象的信息
         
          //獲取全部的構造方法集合
         Constructor con1[] = cls1.getDeclaredConstructors();
         con1[1].setAccessible(true);
         Object obj1 = con1[1].newInstance(new Object[]{"tom"});
         System.out.println(obj1);

                 獲取類的成員變量:

                

 /** * 獲取成員變量Field * getField() * getDeclaredField() * */
         Field mem = cls1.getDeclaredField("name");
         mem.setAccessible(true);      
         System.out.println("we get form field :"+mem.get(obj));
獲取類的方法:
 /** * 調用類的方法 Method * getMethod() * getDeclaredMethod() * * */
         Method f = cls1.getMethod("getName", null);
         Object name = f.invoke(obj, null);
         System.out.println("we invoke method : "+ name);
相關文章
相關標籤/搜索