java學習之 反射

來源:互聯網
上載者:User

標籤:

以前學習java只是學習了基本文法操作,各種常用方法的使用,隨著慢慢學習,很多大神都覺得要想成為大神,就必須把java的反射給理解透,這樣我就帶著好奇的心去學習到底反射是什麼玩意,所以就上網找資料學習去了,沒想到收穫真的不小,其實我們平時用的跟多操作都是通過反射來完成的,比如對於servlet在web.xml的配置都是同過反射來建立一個對象,還有SSH都是通過反射來執行個體化對象的,通過了反射讓我更好的理解SSH架構。下面小弟就開始小談一下反射的詳細內容吧, 由於本人水平有限,若文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!希望能互相學習。

反射其實就是通過Class對象擷取類型的相關資訊;

與反射相關的類

1: Class:表示類;

2: Field:表示成員變數;
3: Method:表示方法;
4: Constructor:表示構造器

1:class類:擷取class類的話有三種方法

如定義一個Users類

 

 

public class Users {    private Integer Id;    private String Name;    private Date Birth;    private float Score;    public Integer getId() {        return Id;    }    @Override    public String toString() {        return "Users [Id=" + Id + ", Name=" + Name + ", Birth=" + Birth                + ", Score=" + Score + "]";    }    public Users() {    }    public Users(int id) {        this.Id = id;    }    public void setId(Integer id) {        Id = id;    }    public String ResultStr() {        return "str";    }    public String getName() {        return Name;    }    public void setName(String name) {        Name = name;    }    public Date getBirth() {        return Birth;    }    public void setBirth(Date birth) {        Birth = birth;    }    public float getScore() {        return Score;    }    public void setScore(float score) {        Score = score;    }}

 

 

 


那麼可以通過三種方式來擷取該類

Usersp = new Users();
  // 擷取類的三種方法

  Class c2 = p.getClass();//建立一個對象是再擷取該類
  Class c1 = Users.class;//直接通過類的靜態方法來擷取該類
  Class c3 = Class.forName("com.lishun.Peason");//通過包名和類名來擷取該類(設定檔就是通過這種方式來擷取執行個體)

 

擷取到了類就可以擷取該類的構造器,方法和成員了(這裡就使用上面的第三種方法擷取類執行個體)

1:擷取構造器:Constructor

Class c3 = Class.forName("com.lishun.Peason");//
  //擷取本類和父類一個公有構造器
  Constructor cPublic=c3.getConstructor(int.class);//int.class指的的含有一個int型別參數的構造器
  //擷取本類和父類所有公有構造器
  Constructor[] cPublicAll=c3.getConstructors();
  
  //擷取本類一個私人或公有構造器
  Constructor cPublicOrPrivaet=c3.getDeclaredConstructor();
  //擷取本類所有公有或私人的構造器
  Constructor[] cPublicOrPrivaetAll=c3.getDeclaredConstructors();
  
  //執行構造方法
  Peason p=(Peason)cPublic.newInstance(1);

2:擷取方法:Method

 //擷取本類和父類單個公有的方法
   Method m=c3.getMethod("ResultStr");
   //擷取本類和父類所有的公有的方法
   Method[] mall=c3.getMethods();
   
   //擷取本類單個公有或私人的方法(所有存取層級都可擷取到)
   Method m1=c3.getDeclaredMethod("ResultStr1",String.class);
   //擷取本類所有的公有或私人的方法(所有存取層級都可擷取到)
   Method[] mall1=c3.getDeclaredMethods();
   
   //執行該方法
   m.invoke(c3.newInstance());//若執行靜態方法,第一個參數為null 無需新的對象

3:成員:Field
   //擷取本類和父類單個公有的方法
   try {
    Field f = c3.getField("Name");
   } catch (Exception e) {
    System.out.println(e.getMessage());
   }
   //擷取本類和父類所有的公有的方法
   Field[] fall=c3.getFields();
   
   //擷取本類單個公有或私人的成員(所有存取層級)
   Field f1=c3.getDeclaredField(Name");
   //擷取本類所有的公有或私人的方法(所有存取層級)
   Field[] fall1=c3.getDeclaredFields();
   Object o=c3.newInstance();
   //給成員賦值,private成員,方法,構造器 預設都是不能賦值的
   f1.setAccessible(true);//把private的成員設定為可用
   f1.set(o, "lishun");
   System.out.println(o);

好了我所理解的反射就這些了,,小弟在此若還有沒提全的或有錯誤的,望各位大神們指正出來,我也是個在學習中的小菜鳥,,希望能學得到更多的技術知識

 

java學習之 反射

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.