收藏 分销(赏)

Java反射参数传递.doc

上传人:xrp****65 文档编号:8972705 上传时间:2025-03-09 格式:DOC 页数:4 大小:37.50KB
下载 相关 举报
Java反射参数传递.doc_第1页
第1页 / 共4页
Java反射参数传递.doc_第2页
第2页 / 共4页
点击查看更多>>
资源描述
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(Object...objs){ System.out.print("函数参数:" + objs.length + "----------------"); for(Object o : objs ){ System.out.print(o.toString() + " "); } } 而当我们使用Class.getMethod,则需要传递所调用函数的参数类型。查看Class.getMethod 的API可知,需要传递的类型被表示为一个可变参数。 我们知道,传递可变参数时,非序列参数会被编译成编列,即变成一个Object[]类型的数组,但是本身为序列的则会直接被转型Object[]数组。 那么,前三种情况按照要求传递,则传递给getMethod的参数会被转变为一个一维的参数列表的Object数组。第四种情况,其函数本身便要求传递一个可变参数,即一个Object[]类型的参数。如果我们按照正常方法传递,则此Object[]类型的参数会被直接转型使用,而我们最终传给函数的应该是一个二维的Ojbect数组,即Object[][]类型。getMethod方法的匹配过程是指寻找参数长度与Object数组的长度相等,且每个参数类型与Object数组每个数组项相同的方法。 所以,再这种情况下,我们应当对每四种情况下将要传递的参数进行一次包装,将其包装成一个二维的Object数组。方法如下: Object[] obj = new Object[1];     String[] strs = new String[]{"xiao","she", "qing"}; obj[0] = strs ; 此时的obj则是我们将要传给Class.getMethod的参数,而strs则是我们要传递给调用函数test(Object...objs)的参数。这里的obj长度为1是因为可变参数在没有参数传递之前的检查时的长度为1,被视为一元参数。 由于Spring使用的是Java代理,所以,在Spring中会经常遇到类似的问题。 具体代码如下: package test; import java.lang.reflect.InvocationTargetException; import 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.print("函数参数:" + 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 : methods){ 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.invoke(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.invoke(demo, str1, str2); System.out.println("--------------------------------------"); Object[] obj = new Object[1]; obj[0] = new String[]{"xiao", "she", "qing"}; //obj[1] = new String[]{"xiao", "qing"}; method = MethodDemo.class.getMethod("test", Object[].class); method.invoke(demo, obj); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服