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
相关推荐
在`InvokeMethodDemo02.java`中,可能会涉及更复杂的场景,比如处理带有可变参数的方法,或者处理静态方法,这些都需要使用到`Method`类的特定方法来实现。 接着,`ArrayClassDemo.java`可能展示了如何通过反射操作...
而`String`对象虽然也有类似的功能,但由于其设计为不可变对象,为了保持简洁性和一致性,选择通过方法的方式来获取长度,这样可以在内部进行优化,比如缓存长度值以提高多次调用时的性能。 **原因二:设计哲学** ...
Java反射是Java编程语言的一个特性,它允许运行时检查和操作程序结构(类、字段、方法等)。反射的主要用途包括但不限于:动态实例化对象、访问私有成员、调用方法、获取类的信息等。 #### 二、如何创建反射类? ...
对于每个类,Java运行时环境都会维护一个不可变的`Class`对象,这个对象反映了该类的各种属性和行为。通过反射API,开发者能够调用`Class`对象的方法,获取诸如构造函数、方法和字段等信息。此外,`Class`对象同样...
Java安全漫谈 - 反射篇(3)深入讲解了如何在Java中通过反射机制处理可变长参数和访问私有方法。反射是Java中一个强大的特性,它允许程序在运行时检查和操作类、接口、字段和方法,极大地增强了代码的灵活性。然而,这...
在Java标准库源码的修改方面,由于Java的源码通常是不可变的,我们不能直接在`Class`的构造器中添加代码。如果需要调试或学习,可以通过反编译、修改、再编译的方式,或者使用Java代理(Java代理,即`java.lang....
1. **通过反射获取形参为引用类型数组的Method**:使用`invoke`方法运行时,`invoke`方法有一个`Object`类型的可变参数。当传入一个引用数据类型数组时,会被当作`Object[]`处理。 2. **数组类型名**:数组类型名以...
配置eclispe的编译与运行环境rar在eclispe中配置java模板代码.rar在eclipse中导入已有的工程.rarjava5的静态导入与编译器语法设置.rar可变参数与OverLoad相关面试题分..java5的增加for循环.rar 基本数据的自动拆装箱...
在众多编程语言中,Java反射的灵活性和强大功能使其独树一帜,尤其是在Java Bean组件化、框架扩展性等方面发挥了关键作用。 #### 反射的基本概念与用途 ##### 反射的概念 反射机制允许程序在运行时获取类的信息,...
枚举类型的数据可以通过`.values()`方法获取一个枚举对象的数组,便于遍历和处理。在`switch`语句中使用枚举时,只需直接使用枚举对象,无需加上枚举类名。 枚举类中的每个枚举成员都有一个默认的整型值,称为`...
通过反射API,可以读取和处理程序中的注解信息。 这些特性极大地提升了Java的可读性和易用性,使得开发者能够更高效地编写代码。随着JDK的不断更新,例如Java 8、Java 11等,还有更多新特性如Lambda表达式、...
例如,`Handle.asSpreader()`用于把可变参数拆分成数组,而`Handle.asVarargsCollector()`则用于接收数组作为可变参数。 方法句柄还可以与Java的反射API结合使用。通过反射获取方法后,可以调用`handle.unreflect()...
Java的高级特性主要涵盖泛型、枚举、增强for循环(也称为foreach循环)、注解(Annotation)以及可变参数等。这些特性极大地提升了Java语言的灵活性、安全性和可读性,是Java开发者必备的知识点。 1. **泛型**: ...
7. **字符串处理**:String类在Java中是不可变的,提供了丰富的字符串操作方法,如concat、substring、indexOf、replace等。 8. **IO流**:Java的I/O流处理涵盖了文件读写、网络通信等多种场景,包括字节流和字符流...
在JDK1.5中,开发者可以在方法签名中使用省略号(...)表示可变参数。这允许方法接受任意数量的相同类型的参数,如: ```java public void printNumbers(int... nums) { // 代码块 } ``` 这个方法可以接收一个或多...
6. **可变参数(Varargs)**:在方法定义中,使用三个点(...)表示可变参数,允许传入零个或多个同类型的参数。 7. **静态导入(Static Import)**:允许将类的静态成员导入到当前作用域,使得可以直接调用而无需...
6. **字符串处理**:Java中的String类是不可变的,学习如何创建、比较和操作字符串,以及使用StringBuilder和StringBuffer类进行字符串拼接。 7. **异常处理**:学习try-catch-finally语句块,理解异常的分类和处理...
Java提供了数组边界检查来减少这类风险,但开发者仍需警惕在处理字符串、字符数组和其他可变大小数据结构时的潜在问题。 反射攻击是Java特有的安全挑战,它利用了Java的反射API来访问私有成员或执行非公开操作。...