java 使用反射调用可变参数方法
使用反射操作對象-調用可變參數方法
?
要把可變參數都當做是其對應的數組類型參數;
如 show(XX... is)作為show(XX[] is)調用;
?
若可變參數元素類型是引用類型:
JDK內部接收到參數之后,會自動拆包取出參數再分配給該底層方法,為此我們需要把這個數組實參先包裝成一個Object對象或把實際參數作為一個Object一維數組的元素再傳遞。
?
若可變參數元素類型是基本類型:
JDK內部接收到參數之后,不會拆包,所以可以不必再封裝.不過封裝了也不會錯.所以建議,不管基本類型還是引用類型都使用Object[]封裝一層,保證無誤.
?
例子
package junereflect624;
//可變參數的方法調用
?
import java.lang.reflect.Method;
?
class VaryMethod{
??? public static void show(int ...args){
??? ??? System.out.println("基本數據類型傳遞過來了!");
??? }
??? /*public static void show(int[] args){//這是一樣的
??? }*/
??? public static void show(String ...args){
??? ??? System.out.println("引用數據類型傳遞過來了!");
??? }
}
?
public class InvokeVaryDemo10 {
??? public static void main(String[] args) throws Exception{
??? ??? Class<VaryMethod> c = VaryMethod.class;
??? ???
??? ??? Method m = c.getMethod("show",int[].class);
??? ??? m.invoke(null,new int[]{1,2,3});
??? ??? m = c.getMethod("show",String[].class);
??? ??? //m.invoke(null,new String[]{"A","B","C"});//ERROR
??? ??? m.invoke(null,(Object)new String[]{"A","B","C"});//YES,強轉為Object類型
??? ??? m.invoke(null,new Object[]{new String[]{"A","B","C"}});//推薦寫法
??? }
}
轉載于:https://www.cnblogs.com/fanweisheng/p/11136836.html
總結
以上是生活随笔為你收集整理的java 使用反射调用可变参数方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ingress controller 和
- 下一篇: 多线程交替打印示例