1邑商、概況:
是在運(yùn)行狀態(tài)中删掀,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法袁波;對(duì)于任意一個(gè)對(duì)象瓦阐,都能夠調(diào)用它的任意方法和屬性(不能調(diào)用其私有屬性和方法);這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為java語(yǔ)言的反射機(jī)制
2篷牌、原理:
- 當(dāng)一個(gè)類被加載以后睡蟋,Java虛擬機(jī)就會(huì)自動(dòng)產(chǎn)生一個(gè)Class對(duì)象。通過(guò)這個(gè)Class對(duì)象我們就能獲得加載到虛擬機(jī)當(dāng)中這個(gè)Class對(duì)象對(duì)應(yīng)的方法枷颊、成員以及構(gòu)造方法的聲明和定義等信息戳杀。
- 要正確使用Java反射機(jī)制就得使用java.lang.Class這個(gè)類。
3夭苗、優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
1信卡、能夠運(yùn)行時(shí)動(dòng)態(tài)獲取類的實(shí)例,大大提高系統(tǒng)的靈活性和擴(kuò)展性题造。缺點(diǎn):
1傍菇、反射操作的效率要比那些非反射操作低得多,因?yàn)榉瓷浒ㄒ恍㎎VM無(wú)法對(duì)其代碼進(jìn)行優(yōu)化動(dòng)態(tài)類型界赔;
4丢习、使用:
/**
* @author Fang Lingchuan
*
* @deprecated java反射測(cè)試實(shí)體類
*/
public class Programmer {
public int age = 26;
private String name = "LZ";
public Programmer() {
}
public Programmer(int age, String name) {
this.age = age;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void doWork(String work){
System.out.print(age+"歲的"+name+"從事"+work);
}
}
/**
* @author Fang Lingchuan
*
* @deprecated java反射測(cè)試類
*/
public class TestReflection {
public static void main(String[] args){
try {
//獲取Class對(duì)象
Class cp = Class.forName("com.jimi.mvptest.reflection.Programmer");
//獲取class對(duì)象中的dowork方法,該方法帶有一個(gè)字符串參數(shù)
Method mp = cp.getDeclaredMethod("doWork",String.class);
//生成實(shí)例
Object obj = cp.newInstance();
//直接使用方法實(shí)例執(zhí)行方法體
Object retValue = mp.invoke(obj, "ABCD順序的打亂工作\n");
//向下轉(zhuǎn)型淮悼,獲取該類的實(shí)例
Programmer sm = (Programmer) obj;
sm.setName("大川");
sm.doWork("abcd的排列組合");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (NoSuchMethodException e){
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
運(yùn)行結(jié)果: