`
xiaolongfeixiang
  • 浏览: 236815 次
  • 性别: 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反射机制学习(四):通过反射执行方法、操作属性、操作数组中的数据

    在`InvokeMethodDemo02.java`中,可能会涉及更复杂的场景,比如处理带有可变参数的方法,或者处理静态方法,这些都需要使用到`Method`类的特定方法来实现。 接着,`ArrayClassDemo.java`可能展示了如何通过反射操作...

    怎样用Jvm处理Java数组.doc

    而`String`对象虽然也有类似的功能,但由于其设计为不可变对象,为了保持简洁性和一致性,选择通过方法的方式来获取长度,这样可以在内部进行优化,比如缓存长度值以提高多次调用时的性能。 **原因二:设计哲学** ...

    java反射.pdf

    Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用方法、获取类的信息等。 #### 二、如何创建反射类? ...

    JAVA反射详解

    对于每个类,Java运行时环境都会维护一个不可变的`Class`对象,这个对象反映了该类的各种属性和行为。通过反射API,开发者能够调用`Class`对象的方法,获取诸如构造函数、方法和字段等信息。此外,`Class`对象同样...

    Java数组练习题(带答案).doc

    如果需要一个大小可变的数组,可以使用`ArrayList`类。 数组在操作时需要注意几个方面。第一,进行二分查找之前需要先对数组进行排序。第二,数组下标可以是整型常量、变量或者表达式。第三,数组越界异常可以通过`...

    java反射机制详解

    Java反射机制为开发者提供了强大的动态处理能力,特别是在框架设计和代码自动生成等领域有着广泛的应用。通过了解和掌握Java反射机制,可以更好地理解和使用各种基于反射技术的Java框架和技术。

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

    Java安全漫谈 - 反射篇(3)深入讲解了如何在Java中通过反射机制处理可变长参数和访问私有方法。反射是Java中一个强大的特性,它允许程序在运行时检查和操作类、接口、字段和方法,极大地增强了代码的灵活性。然而,这...

    JAVA反射侯捷观点

    在Java标准库源码的修改方面,由于Java的源码通常是不可变的,我们不能直接在`Class`的构造器中添加代码。如果需要调试或学习,可以通过反编译、修改、再编译的方式,或者使用Java代理(Java代理,即`java.lang....

    JAVA基础-反射-枚举

    1. **通过反射获取形参为引用类型数组的Method**:使用`invoke`方法运行时,`invoke`方法有一个`Object`类型的可变参数。当传入一个引用数据类型数组时,会被当作`Object[]`处理。 2. **数组类型名**:数组类型名以...

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

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

    Java 反射详解

    在众多编程语言中,Java反射的灵活性和强大功能使其独树一帜,尤其是在Java Bean组件化、框架扩展性等方面发挥了关键作用。 #### 反射的基本概念与用途 ##### 反射的概念 反射机制允许程序在运行时获取类的信息,...

    Java期末复习——枚举与反射机制

    枚举类型的数据可以通过`.values()`方法获取一个枚举对象的数组,便于遍历和处理。在`switch`语句中使用枚举时,只需直接使用枚举对象,无需加上枚举类名。 枚举类中的每个枚举成员都有一个默认的整型值,称为`...

    JAVA的高级新特性

    通过反射API,可以读取和处理程序中的注解信息。 这些特性极大地提升了Java的可读性和易用性,使得开发者能够更高效地编写代码。随着JDK的不断更新,例如Java 8、Java 11等,还有更多新特性如Lambda表达式、...

    Java方法句柄1

    例如,`Handle.asSpreader()`用于把可变参数拆分成数组,而`Handle.asVarargsCollector()`则用于接收数组作为可变参数。 方法句柄还可以与Java的反射API结合使用。通过反射获取方法后,可以调用`handle.unreflect()...

    Java基础入门教程 第9章 Java的高级特性(共32页).ppt

    Java的高级特性主要涵盖泛型、枚举、增强for循环(也称为foreach循环)、注解(Annotation)以及可变参数等。这些特性极大地提升了Java语言的灵活性、安全性和可读性,是Java开发者必备的知识点。 1. **泛型**: ...

    Java习题_java编程_

    7. **字符串处理**:String类在Java中是不可变的,提供了丰富的字符串操作方法,如concat、substring、indexOf、replace等。 8. **IO流**:Java的I/O流处理涵盖了文件读写、网络通信等多种场景,包括字节流和字符流...

    Java-jdk1.5安装包

    在JDK1.5中,开发者可以在方法签名中使用省略号(...)表示可变参数。这允许方法接受任意数量的相同类型的参数,如: ```java public void printNumbers(int... nums) { // 代码块 } ``` 这个方法可以接收一个或多...

    java jdk 1.5.0

    6. **可变参数(Varargs)**:在方法定义中,使用三个点(...)表示可变参数,允许传入零个或多个同类型的参数。 7. **静态导入(Static Import)**:允许将类的静态成员导入到当前作用域,使得可以直接调用而无需...

    Java核心编程Java 课件ppt

    6. **字符串处理**:Java中的String类是不可变的,学习如何创建、比较和操作字符串,以及使用StringBuilder和StringBuffer类进行字符串拼接。 7. **异常处理**:学习try-catch-finally语句块,理解异常的分类和处理...

Global site tag (gtag.js) - Google Analytics