java反射处理数组

来源:互联网 发布:c# socket编程 编辑:程序博客网 时间:2024/05/24 07:01

Java反射中,如果Method的参数里含有数组或者可变参数形式,那么在调用Invoke的时候,稍有点诡异,这里记录一下。可变参数实质就是数组,调用方式和普通数组一样。


用反射方式执行某个类中的main方法


 

  1. public class ReflectTest {  
  2.     public static void main(String[] args) throws Exception {  
  3.           String startingClassName=args[0];  
  4.           Method  mainMethod=Class.forName(startingClassName).getMethod("main",String[].class);  
  5.             
  6.           //这一点特别注意:这里使用new Object[]数组将new String[] 进行打包成一个对象  
  7.           mainMethod.invoke(null,new Object[]{new String[]{"111","222","333"}});  
  8.           
  9.     }     
  10. }  
  11. class TestArguments {  
  12.       
  13.       public static void main(String[] args)  
  14.       {  
  15.           for(String s:args)  
  16.             System.out.println(s);  
  17.       }  
  18. }  

先看一个简单的类

Java代码  收藏代码
  1. public class Target {  
  2.   
  3.     public void arrayInput(String[] inputs) {  
  4.         for (String each : inputs) {  
  5.             System.out.print(each);  
  6.         }  
  7.         System.out.println();  
  8.     }  
  9. }  

 看如何反射调用含数组参数的方法

Java代码  收藏代码
  1. import java.lang.reflect.Array;  
  2. import java.lang.reflect.Method;  
  3.   
  4. public class ArrayReflection {  
  5.   
  6.     public static void main(String[] args) {  
  7.   
  8.         Class<Target> clazz = Target.class;  
  9.   
  10.         try {  
  11.             Object object = clazz.newInstance();  
  12.   
  13.             // 数组参数的调用方法  
  14.             Method arrayInputMethod = clazz.getMethod("arrayInput",  
  15.                     String[].class);  
  16.             // 写法一,可以理解  
  17.             Object arrayObj = Array.newInstance(String.class2);  
  18.             Array.set(arrayObj, 0"Hello");  
  19.             Array.set(arrayObj, 1"World");  
  20.   
  21.             arrayInputMethod.invoke(object, arrayObj);  
  22.   
  23.             // 写法二,按照Eclipse提示写出来的,不理解  
  24.             String[] stringArray = new String[]{"Cafe","Baby"};  
  25.             arrayInputMethod.invoke(object, new Object[] { stringArray });  
  26.   
  27.         } catch (Exception e) {  
  28.             e.printStackTrace();  
  29.         }  
  30.     }  
  31. }  

 看输出:



 如果这样写

Java代码  收藏代码
  1. arrayInputMethod.invoke(object, new String[]{"wrong","style"});  

 会报如下错误

 java.lang.IllegalArgumentException: wrong number of arguments

原创粉丝点击