`
xiaolongfeixiang
  • 浏览: 234626 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java反射处理数组和可变参数

阅读更多

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

 

先看一个简单的类

public class Target {

	public void arrayInput(String[] inputs) {
		for (String each : inputs) {
			System.out.print(each);
		}
		System.out.println();
	}
}

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

import java.lang.reflect.Array;
import java.lang.reflect.Method;

public class ArrayReflection {

	public static void main(String[] args) {

		Class<Target> clazz = Target.class;

		try {
			Object object = clazz.newInstance();

			// 数组参数的调用方法
			Method arrayInputMethod = clazz.getMethod("arrayInput",
					String[].class);
			// 写法一,可以理解
			Object arrayObj = Array.newInstance(String.class, 2);
			Array.set(arrayObj, 0, "Hello");
			Array.set(arrayObj, 1, "World");

			arrayInputMethod.invoke(object, arrayObj);

			// 写法二,按照Eclipse提示写出来的,不理解
			String[] stringArray = new String[]{"Cafe","Baby"};
			arrayInputMethod.invoke(object, new Object[] { stringArray });

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 看输出:



 如果这样写

arrayInputMethod.invoke(object, new String[]{"wrong","style"});

 会报如下错误

 java.lang.IllegalArgumentException: wrong number of arguments

 

  • 大小: 4.5 KB
分享到:
评论
1 楼 liuzhaodong89 2013-08-13  
如果方法入参只有一个数组参数,编译器可能会将数组参数理解为可变长参数。直接用new String[]{"wrong","style"}传入参数编译器会把他拆成invoke(object, "wrong","style"),但方法本身只有一个入参,所以就出错了吧。
上面的两个方法应该是显示的告诉编译器这个数组是一个参数,而不是一个可变长参数,所以通过了。

相关推荐

    Java基础学习教程(附PPT和源代码)

    配置eclispe的编译与运行环境rar在eclispe中配置java模板代码.rar在eclipse中导入已有的工程.rarjava5的静态导入与编译器语法设置.rar可变参数与OverLoad相关面试题分..java5的增加for循环.rar 基本数据的自动拆装箱...

    Java基础最全笔记文档

    5. Collection集合、数据结构、List集合、泛型、Set集合、可变参数 6. 集合工具类Collections、Map集合、集合嵌套、不可变集合 7. Stream流、异常处理 8. Logback日志框架、阶段项目 9. File、方法递归、字符集、IO...

    疯狂JAVA讲义

    5.2.3 形参长度可变的方法 120 5.2.4 递归方法 121 5.2.5 方法重载 123 学生提问:为什么方法的返回值类型不能用于区分重载的方法? 124 5.3 成员变量和局部变量 124 5.3.1 成员变量和局部变量 125 5.3.2 成员...

    Java基础知识点总结.docx

    可变参数(...) 86 枚举:关键字 enum 86 自动拆装箱 86 泛型 87 &lt;java.lang&gt;System 89 &lt;java.lang&gt;Runtime 90 &lt;java.lang&gt;Math 90 &lt;java.lang&gt;.Date:日期类,月份从0—11 92 &lt;java.lang&gt; Calendar:日历类 93 ...

    Java基础知识点.html

    类加载器 ClassLoader 反射 Stream 流 函数式编程 Lambda 表达式 网络编程-协议 网络编程-端口 网络编程-IP 多线程 IO流-字节流 IO流-字符流 IO流-转换流 File Map HashMap 序列化和反序列化 可变参数 类型通配符 ...

    Java面试题.docx

    19、String为什么要设计成不可变的? 20、Object类的equal和hashCode方法重写,为什么? 21-40题 21、List,Set,Map的区别 26、ArrayMap和HashMap的对比 29、HashMap和HashTable的区别 30、HashMap与HashSet的...

    Java安全漫谈 - 03.反射篇(3)1

    对于可变长参数,Java其实在编译的时候会编译成一个数组,也就是说,如下这两种写法在底层是等价的(也就不能重载):也由此,如果我们有一个数组,想传给hello函

    Java2核心技术.part5

    12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7...

    Java经典编程源码基础例程300.zip

    实例077 创建长度可变的数组 117 实例078 利用反射重写toString()方法 119 第8章 字符串与包装类 121 实例079 将数字格式化为货币字符串 122 实例080 货币金额大写格式 123 实例081 String类格式化当前日期 125 实例...

    JAVA面试题最全集

    简述 Java Server Page 和 Servlet 的联系和区别。 33.简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34.EJB规范规定EJB中禁止的操作有哪些? 35.java除了8种基本类型外,在虚拟机里还有哪一种,...

    corejava培训文档

    1. 前言 1.1. JAVA特点 1.2. 运行原理 1.3. JAVA目录 2. 一 基础知识 2.1. 配置环境 2.2. Java中基本概念 ...17.8. 可变长的参数 17.9. JAVA5.0 的注释 (Annotation) 17.10. Callable 和 Future接口

    JAVA 范例大全 光盘 资源

    实例95 参数不确定(可变长参数) 249 实例96 方法改变(协变式返回类型) 251 实例97 静态导入 252 实例98 动物搭配(泛型) 253 实例99 人员信息(枚举类型) 256 实例100 printf()用法 260 实例101 使用...

    Java JDK实例宝典

    5 可变长参数Varargs 16. 6 格式化输出 16. 7 使用ProcessBuilder执行本地命令 16. 8 泛型编程 16. 9 注释功能Annotation 16. 10 监控与管理虚拟机 16. 11 线程——Callable和Future ...

    Java2核心技术.part3

    12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7...

    Java2核心技术.part1

    12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7版本 ...

    Java2核心技术.part6

    12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7...

    Java2核心技术.part4

    12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7...

    Java2核心技术.part2

    12.5.1存储可变类型的对象 12.5.2理解对象序列化文件格式 12.5.3保存对象引用问题的解决 12.5.4理解对象引用的输出格式 12.5.5修改默认的序列化机制 12.5.6单元素与类型安全枚举的序列化 12.5.7...

    java学习笔记 初学者必读

    1. 前言 1-4 1.1. JAVA特点 1-4 1.2. 运行原理 1-4 1.3. JAVA目录 1-4 2. 一•基础知识 2-4 ...17.8. 可变长的参数 17-73 17.9. JAVA5.0 的注释 (Annotation) 17-73 17.10. Callable 和 Future接口 17-74

Global site tag (gtag.js) - Google Analytics