標籤:
以前學習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學習之 反射