1、JAVA反射参数传递概略 2009-11-30 15:57:23| 分类: Java 程序|字号 订阅使用 Method 反射调用函数时,我们通常会遇到以下几种情况:public void test()System.out.println(函数参数:0);public void test(String str)System.out.println(“函数参数:1-“ + str);public void test(String str1, String str2)System.out.println(“函数参数:2-“ + str1 +“ “ + str2);public void test(
2、Object.objs)System.out.print(“函数参数:“ + objs.length + “-“);for(Object o : objs )System.out.print(o.toString() + “ “);而当我们使用 Class.getMethod,则需要传递所调用函数的参数类型。查看Class.getMethod 的 API 可知,需要传递的类型被表示为一个可变参数。我们知道,传递可变参数时,非序列参数会被编译成编列,即变成一个 Object类型的数组,但是本身为序列的则会直接被转型 Object数组。那么,前三种情况按照要求传递,则传递给 getMethod 的
3、参数会被转变为一个一维的参数列表的 Object 数组。第四种情况,其函数本身便要求传递一个可变参数,即一个Object类型的参数。如果我们按照正常方法传递,则此 Object类型的参数会被直接转型使用,而我们最终传给函数的应该是一个二维的 Ojbect 数组,即 Object类型。getMethod 方法的匹配过程是指寻找参数长度与 Object 数组的长度相等,且每个参数类型与 Object 数组每个数组项相同的方法。所以,再这种情况下,我们应当对每四种情况下将要传递的参数进行一次包装,将其包装成一个二维的 Object 数组。方法如下:Object obj = new Object1;S
4、tring strs = new String“xiao“,“she“, “qing“;obj0 = strs ;此时的 obj 则是我们将要传给 Class.getMethod 的参数,而 strs 则是我们要传递给调用函数 test(Object.objs)的参数。这里的 obj 长度为是因为可变参数在没有参数传递之前的检查时的长度为,被视为一元参数。由于 Spring 使用的是 Java 代理,所以,在 Spring 中会经常遇到类似的问题。具体代码如下:package test;import java.lang.reflect.InvocationTargetException;imp
5、ort java.lang.reflect.Method;public class MethodDemo public void test()System.out.println(“函数参数: 0“);public void test(String str)System.out.println(“函数参数: 1-“ + str);public void test(String str1, String str2)System.out.println(“函数参数: 2-“ + str1 + “ “ + str2);public void test(Object.objs)System.out.p
6、rint(“函数参数: “ + objs.length + “-“);for(Object o : objs )System.out.print(o.toString() + “ “);/* param args*/* param args*/public static void main(String args) /testMethod();printMethodType();public static void printMethodType()Method methods = MethodDemo.class.getMethods();Class cs;for(Method m : me
7、thods)System.out.println(“-“ + m.getName() + “-“);cs = m.getParameterTypes();System.out.println(cs.length);for(Class c : cs)System.out.println(c.toString();public static void testMethod()MethodDemo demo = new MethodDemo();Method method;try method = MethodDemo.class.getMethod(“test“, null);method.inv
8、oke(demo, null);System.out.println(“-“);String content = “xiao“;method = MethodDemo.class.getMethod(“test“, String.class);method.invoke(demo, content);System.out.println(“-“);String str1 = “xiao“;String str2 = “qing“;method = MethodDemo.class.getMethod(“test“, String.class, String.class);method.invo
9、ke(demo, str1, str2);System.out.println(“-“);Object obj = new Object1;obj0 = new String“xiao“, “she“, “qing“;/obj1 = new String“xiao“, “qing“;method = MethodDemo.class.getMethod(“test“, Object.class);method.invoke(demo, obj); catch (SecurityException e) / TODO Auto-generated catch blocke.printStackT
10、race(); catch (NoSuchMethodException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IllegalArgumentException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IllegalAccessException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (InvocationTargetException e) / TODO Auto-generated catch blocke.printStackTrace();