工作需要用到類(lèi)方法的反射調(diào)用,網(wǎng)上找到這樣一段代碼:
public static Object invokeMethod(Object object, String methodName, Class[] parameterTypes, Object... parameters) {
//根據(jù) 對(duì)象蜀踏、方法名和對(duì)應(yīng)的方法參數(shù) 通過(guò)反射 調(diào)用上面的方法獲取 Method 對(duì)象
Method method = getDeclaredMethod(object, methodName, parameterTypes);
//抑制Java對(duì)方法進(jìn)行檢查,主要是針對(duì)私有方法而言
method.setAccessible(true) ;
try {
if(null != method) {
//調(diào)用object 的 method 所代表的方法维蒙,其方法的參數(shù)是 parameters
return method.invoke(object, parameters) ;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
哎,既然后面?zhèn)魅肓?parameters果覆,那么 parameterTypes 直接 parameters.getClass() 就好了颅痊,何必再傳;
于是稍加修改局待,該方法變成這個(gè)樣子:
public static Object invokeMethod(Object object, String methodName, Object... parameters) {
//根據(jù) 對(duì)象斑响、方法名和對(duì)應(yīng)的方法參數(shù) 通過(guò)反射 調(diào)用上面的方法獲取 Method 對(duì)象
Class[] parameterTypes = new Class[parameters.length];
for(int i = 0; i < parameters.length; i++){
parameterTypes[i] = parameters[i].getClass();
}
Method method = getDeclaredMethod(object, methodName, parameterTypes);
//抑制Java對(duì)方法進(jìn)行檢查,主要是針對(duì)私有方法而言
method.setAccessible(true) ;
try {
if(null != method) {
//調(diào)用object 的 method 所代表的方法,其方法的參數(shù)是 parameters
return method.invoke(object, parameters) ;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
嗯燎猛,不禁為自己的機(jī)智點(diǎn)贊恋捆;
于是加入工程照皆,跑起來(lái)重绷,哎,怎么反射找不到方法膜毁;
仔細(xì)觀察昭卓,調(diào)用時(shí)的代碼是 ClassReflectionUtils.invokeMethod(obj, "func", 123);
調(diào)試步進(jìn),觀察 paramters瘟滨,發(fā)現(xiàn)變成了 Integer 類(lèi)型候醒;
原來(lái)立即數(shù)會(huì)被強(qiáng)轉(zhuǎn)為這種“高級(jí)立即數(shù)類(lèi)”;
那么再測(cè)試一下:
public static void fun(Object... args){
for(Object object : args){
Class xx = object.getClass();
System.out.println(xx);
}
return;
}
public static void main(String[] args) {
int m = 1;
double n = 2.3;
fun(m, n);
}
得到了如下輸出:
嗯杂瘸,看來(lái)確實(shí)會(huì)被強(qiáng)轉(zhuǎn)倒淫,那么 invokeMethod 的 parameterTypes 參數(shù)是不可省略了,再恢復(fù)之前的 invokeMethod 败玉,跑起來(lái)敌土,成功了。
其實(shí)省略該參數(shù)還有一個(gè)問(wèn)題运翼,當(dāng) parameters.getClass() 為子類(lèi)返干,而指定 method 中需要的父類(lèi)時(shí),findMethod 應(yīng)該也找不到方法血淌,這里感興趣的讀者可以自行測(cè)試一下矩欠。