調(diào)用一個方法當中含有幾個要素?
1、調(diào)用哪個對象
2、調(diào)用哪個方法
3、調(diào)用方法的時候傳什么參數(shù)
4、方法執(zhí)行結束之后的返回結果
調(diào)用哪個對象的哪個方法,傳什么參數(shù),返回什么值
即使是使用反射機制調(diào)用方法,也同樣需要具備這四個要素
使用反射機制怎么調(diào)用方法
1、編寫一個方法類SomeServicepublic class SomeService {public void doSome(){System.out.println("public void doSome()執(zhí)行。");
}
public String doSome(String s){System.out.println("public String doSome(String s)執(zhí)行。");
return s;
}
public String doSome(String s,int i){System.out.println("public String doSome(String s,int i)執(zhí)行");
return s+i;
}
}
2、通過反射機制調(diào)用SomeService類中的方法1、獲取類:
Class>clazz = Class.forName("com.bjpowernode.spring.reflect.SomeService");
2、獲取方法:
getDeclaredMethod:
第一個參數(shù):方法名
第二個參數(shù):方法中的參數(shù)
在一個類當中,方法名是可以一樣的。Java語法中允許方法重載,因此只通過方法名是獲取不到方法的,需要借助第二個參數(shù)。告訴Java程序到底是哪個doSome方法。通過參數(shù)來區(qū)分方法。
Method doSomeMethod = clazz.getDeclaredMethod("doSome", String.class, int.class);
3、調(diào)用方法:
四要素:調(diào)用哪個對象的哪個方法,傳什么參數(shù),返回什么值
獲取對象的兩種方法:
Object obj = clazz.newInstance();
如果覺得該方法已經(jīng)過時,還可以通過獲取類的無參數(shù)構造方法創(chuàng)建對象:
//獲取無參數(shù)構造方法創(chuàng)建對象
Constructor>con = clazz.getDeclaredConstructor();
Object obj2 = con.newInstance();
四要素:
//obj:哪個對象
//doSomeMethod:哪個方法
//"小白", 23:傳什么參數(shù)
//retValue:返回什么值
Object retValue = doSomeMethod.invoke(obj, "小白", 23);
執(zhí)行結果:
完整代碼:
public class Test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {//獲取類
Class>clazz = Class.forName("com.bjpowernode.spring.reflect.SomeService");
//獲取方法 (參數(shù):方法名,可變長)
Method doSomeMethod = clazz.getDeclaredMethod("doSome", String.class, int.class);
//調(diào)用方法
//四要素:調(diào)用哪個對象的哪個方法,傳什么參數(shù),返回什么值
Object obj = clazz.newInstance();
//獲取無參數(shù)構造方法創(chuàng)建對象
//Constructor>con = clazz.getDeclaredConstructor();
//Object obj2 = con.newInstance();
Object retValue = doSomeMethod.invoke(obj, "小白", 23);
System.out.println(retValue);
}
}
二、反射機制之Spring-DI核心實現(xiàn)需求:
假設現(xiàn)在已知以下信息:1、有這樣一個類,類名叫做:com.bjpowernode.spring.reflect.User
2、這個類符合javabean規(guī)范。屬性私有化,對外提供公開的setter和getter方法
3、知道這個類當中有一個屬性,age
4、并且還知道age屬性的類型是int類型
通過反射機制調(diào)用相關方法,給User對象的age屬性賦值
關鍵在于
1、通過已知的屬性名拼接出方法名:
String setMethodName = "set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);
2、根據(jù)屬性名獲取屬性類型:
//根據(jù)屬性名獲取屬性類型
Field field = clazz.getDeclaredField("age");
然后直接 field.getType() 就是屬性類型=int.Class
完整代碼:
public class Test4 {public static void main(String[] args) throws Exception {//已知類名:
String className = "com.bjpowernode.spring.reflect.User";
//已知屬性名:
String propertyName = "age";
//通過反射機制調(diào)用setAge(int)方法
Class>clazz = Class.forName(className);
//拼接set方法名
String setMethodName = "set"+propertyName.toUpperCase().charAt(0)+propertyName.substring(1);
//根據(jù)屬性名獲取屬性類型
Field field = clazz.getDeclaredField("age");
Method setAgeMethod = clazz.getDeclaredMethod(setMethodName, field.getType());
Object o = clazz.newInstance();
//給屬性賦值
setAgeMethod.invoke(o, 23);
System.out.println(o);
}
}
執(zhí)行結果:
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧