* 要把可变参数都当做是其对应的数组类型参数; 如 show(XX… is)作为show(XX[] is)调用; 若可变参数元素类型是引用类型:

  * JDK内部接收到参数之后

  * ,会自动拆包取出参数再分配给该底层方法,为此我们需要把这个数组实参先包装成一个Object对象或者把实际参数作为一个Object一维数组的元素再传递。

  * 若可变参数元素类型是基本类型:

  * JDK内部接收到参数之后,不会拆包,所以可以不必再封装。不过封装了也不会错。所以建议,不管基本类型还是引用类型都使用Object[]封装一层,保证无误。

  * 以后使用反射调用方法: 推荐使用 invoke(方法底层对象, new Object[]{ 底层方法需要的实际参数 });这个应该说是万能的

package cn.com.java.wwh.www;
  import java.lang.reflect.Method;
  import java.util.Arrays;
  class Test{
  public static void main(String [] args){
  System.out.println(Arrays.toString(args));
  }
  public static void show1(String…args)
  {
  System.out.println(Arrays.toString(args));
  }
  public static void show2(int [] args){
  System.out.println(Arrays.toString(args));
  }
  }
  public class InvokeMethodDemo {
  public static void main(String[] args)throws Exception {
  // 获得类的字节码
  Class test = Test.class;
  Method method = test.getMethod("show1", String[].class);
  System.out.println(method);
  // 当调用静态的方法时,invoke的第一个参数可以为null.正常是写成
  // method.invoke(test.newInstance(),"疯狂软件","22");//错误!
  // method.invoke(null,"疯狂软件","22");//错误!它就类似show1(String s1, String s2)
  // method.invoke(null,new String[]{"疯狂软件","22"});//错误!
  // method.invoke(null, new Object[]{"疯狂软件","22"});//错误!
  method.invoke(null, (Object)new String[]{"疯狂软件","22"});//正确写法
  method.invoke(null,new Object[]{new String[]{"疯狂软件","22"}});//正确写法
  // -----------------第二种情况----------------------
  Method meth = test.getMethod("show2", int[].class);
  // meth.invoke(null,1,2,3,4);//错误
  meth.invoke(null,new int[]{1,2,3});//正确
  // meth.invoke(null,new Object[]{1,2,3});//错误!
  meth.invoke(null,(Object)new int[]{1,2,3});//正确
  meth.invoke(null,new Object[]{new int[]{1,2,3,4}});//正确
  // 加入调用Test的main方法
  Method me = test.getMethod("main",String[].class);
  me.invoke(null, new Object[]{new String[]{"疯狂软件","无悔"}});
  }
  }