最近在研究spring框架中剩,而spring的ioc是基于反射機(jī)制來完成的咐扭,因此先來學(xué)習(xí)下反射
使用場景
當(dāng)我們的程序在運(yùn)行時(shí)蜕企,需要?jiǎng)討B(tài)的加載一些類劲厌,而這些類可能由于之前用不到所以沒有加載到j(luò)vm,而是在運(yùn)行時(shí)根據(jù)需要才加載刽射,比如军拟,我們之前連接mysql時(shí),都要?jiǎng)討B(tài)的加載mysql驅(qū)動(dòng)程序柄冲,這時(shí)就要用到反射吻谋。原理機(jī)制
- java文件會(huì)被被編譯成class文件
- 通過class文件名獲取這個(gè)文件
- 調(diào)用newInstance動(dòng)態(tài)的創(chuàng)建這個(gè)類
- 實(shí)現(xiàn)
- 獲取class文件(三種方法)
- Class.forName
- 對(duì)象.getClass
- 對(duì)象.class
- 創(chuàng)建對(duì)象
調(diào)用newInstance()方法 - 獲取對(duì)象參數(shù)
- getFiled: 訪問公有的成員變量
- getDeclaredField:所有已聲明的成員變量忠蝗。但不能得到其父類的成員變量
- 調(diào)用對(duì)象方法
- getDeclaredMethods()方法返回類或接口聲明的所有方法现横,包括公共、保護(hù)阁最、默認(rèn)(包)訪問和私有方法戒祠,但不包括繼承的方法。
2.getMethods()方法返回某個(gè)類的所有公用(public)方法速种,包括其繼承類的公用方法姜盈。
- getDeclaredMethods()方法返回類或接口聲明的所有方法现横,包括公共、保護(hù)阁最、默認(rèn)(包)訪問和私有方法戒祠,但不包括繼承的方法。
- 實(shí)例
public class testReflection {
public int age=10;
public int getAge(){
return age;
}
public int getSome(int i){
return i;
}
public static void main(String[] args) throws Exception{
Class<?> clazz=Class.forName("xy.reflection.testReflection");
//無參方法
Method method=clazz.getMethod("getAge");
int i=(Integer) method.invoke(clazz.newInstance());
System.out.println(i+"");
//有參方法
Method m=clazz.getMethod("getSome", int.class);
int j=(Integer) m.invoke(clazz.newInstance(),100);
System.out.println(j+"");
}
@Test
public void testMethod() throws Exception{
Class<?> clazz=Class.forName("xy.reflection.testReflection");
System.out.println(clazz.getName());
//獲取對(duì)象的屬性
Field field=clazz.getDeclaredField("age");
field.set(this,2);
System.out.println(age+"");
}
}