1.反射是什么?
1) Java 中的一組API
1.1)Class
1.2)Constructor
1.3)Field
1.4)Method
1.5)..................
2) Java 對象運行的一種機制
2.反射的作用?
1)動態(tài)的加載類,動態(tài)構(gòu)建對象,...
2)不能預(yù)知未來,但可以駕馭未來,....
3.反射的起點(Class對象)?
反射的起點可以理解為Class類型的對象.
Class類型的對象每個類都有一份且只有一份.
class Point{}
Point.class
獲取類(Class)對象的方式:
1) Class c1=Point.class;
2) Class c2=new Point().getClass();
3) Class c3=Class.forName("包名.類名");
c1==c2? true
c2==c3? true
當我們運行一個類時,首先會檢測JVM內(nèi)存中是否存儲著類的結(jié)構(gòu)信息,假如沒有存儲,會由類的加載器將來讀到內(nèi)存,存儲到JVM方法區(qū)(存儲的是類的結(jié)構(gòu)信息).同時在加載過程中會創(chuàng)建一個Class對象(類對象)
了解:類的加載器(ClassLoader)
4. 通過類對象(Class對象)構(gòu)建類的對象
//靜態(tài)方式構(gòu)建類的對象
Point p1=new Point();
//動態(tài)方式構(gòu)建類的對象
Class c1=Class.forName("reflect.Point");
Object o1=c1.newInstance();
要求:被加載的類必須提供無參構(gòu)造函數(shù)
5. 通過類對象獲得構(gòu)造方法對象.
......
Constructor con1= c1.getDeclaredConstructor(String.class);
Object ob1=con1.newInstance("大師兄");
......
6. 通過類對象獲得屬性對象,操作屬性對象
......
Field f1=c1.getDeclaredField("name");
//Field[] fs=c1.getDeclaredFields();
f1.setAccessible(true);
Object f1Value=f1.get(obj2);
...........
f1.set(obj2, "二師兄");
f1Value=f1.get(obj2);
......
7. 通過類對象獲得方法對象,動態(tài)訪問方法對象
Method m1= c1.getDeclaredMethod("setName",String.class);
.....
Method m2 = c1.getDeclaredMethod("getName");
result=m2.invoke(obj1);
........
代碼示例:改變泛型的限制