準(zhǔn)備一個(gè)被反射的Bean
final public class RelectionTest {
private String name;
public int age;//準(zhǔn)備一個(gè)公開(kāi)的成員變量
private boolean gender;
private String desc;
public RelectionTest(){}
public RelectionTest(String name, int age) {
this.name = name;
this.age = age;
}
···
public void setName(String name) {
this.name = name;
}
/**
* 特意準(zhǔn)備一個(gè)私有方法
*/
private String getDesc() {
return desc;
}
private void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "RelectionTest{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
", desc='" + desc + '\'' +
'}';
}
1.獲取指定構(gòu)造函數(shù)并創(chuàng)建對(duì)象
Class rc = Class.forName("com.stu.java.reflection.RelectionTest");
//1.選定構(gòu)造函數(shù)類型創(chuàng)建對(duì)象-------------
Class[] paramsType = new Class[2];
paramsType[0] = String.class;
paramsType[1] = int.class;
Constructor constructor = rc.getConstructor(paramsType);
//準(zhǔn)備構(gòu)造參數(shù) 值
Object[] args = new Object[2];
args[0] = "obj";
args[1] = 101;
Object obj = constructor.newInstance(args);
LogUtils.sysPrintln(obj.toString());
// RelectionTest{name='obj', age=101, gender=false, desc='null'}
2.調(diào)用公|私方法
Object objM = rc.newInstance();//注意 是否支持無(wú)參構(gòu)造,否則會(huì)拋出 創(chuàng)建實(shí)例異常:InstantiationException
LogUtils.sysPrintln(objM.toString());
// RelectionTest{name='null', age=0, gender=false, desc='null'}
//指定參數(shù)類型
Class[] mPt1 = {String.class};
//獲取對(duì)應(yīng)方法
Method setNameMethod = rc.getMethod("setName",mPt1);
//呼叫方法
setNameMethod.invoke(objM,"objM");
Method setAgeMethod = rc.getMethod("setAge", int.class);//這都直接有代碼提示了蚯瞧。。品擎。
setAgeMethod.invoke(objM,99);
//獲取一個(gè)私有方法
Method setDescMethod = rc.getDeclaredMethod("setDesc", String.class);
setDescMethod.setAccessible(true);//true 取消java語(yǔ)言檢查埋合,flase 反之使用
setDescMethod.invoke(objM,"反射呼叫 setDesc方法");
//獲取一個(gè)私有方法-優(yōu)化
Method getDescMethod = rc.getDeclaredMethod("getDesc");
if(Modifier.isPrivate(getDescMethod.getModifiers())){
getDescMethod.setAccessible(true);
}
Object desc = getDescMethod.invoke(objM);
LogUtils.sysPrintln("desc=%s",desc);
LogUtils.sysPrintln(objM.toString());
// RelectionTest{name='objM', age=99, gender=false, desc='反射呼叫 setDesc方法'}
3.修改公|私成員變量的值
Object objF = rc.newInstance();
Field ageF = rc.getField("age");
if(ageF.getType()==int.class){
ageF.setInt(objF,101);
}
//同獲取私有方法一樣,如果是私有限制 則不能直接用getField 要用 getDeclareField
Field nameF = rc.getDeclaredField("name");// 又自動(dòng)補(bǔ)全了萄传。甚颂。。秀菱。一直補(bǔ)一直爽
if(Modifier.isPrivate(nameF.getModifiers())){
nameF.setAccessible(true);
}
//這里應(yīng)當(dāng) 根據(jù)不同type 來(lái)調(diào)用對(duì)應(yīng)的賦值方法振诬,這里因?yàn)槲覀冎肋@個(gè)成員類型為String.class 所以偷懶省去
nameF.set(objF,"objF");
LogUtils.sysPrintln(objF.toString());
// RelectionTest{name='objF', age=101, gender=false, desc='null'}
END
參考:https://github.com/HarkBen/JavaSE6Tutorial/blob/master/docs/CH16.md