-
关于包装类数组作为方法参数类型时,反射invoke方法的问题10
问题描述:
1. 某方法
public class A{ private Long[] ids1; private long[] ids2; public void setIds1(Long[] ids1){ this.ids1 = ids1; System.out.println("This is Long Array Type"); } public void setIds2(long[] ids2){ this.ids2 = ids2; System.out.println("This is long Array Type"); } } public class Util{ public static Object[] getFieldValues(Class<?> fieldType, String[] paramValues){ if (!fieldType.isArray()){ return null; } int paramLength = paramValues.length; if (Long[].class.isAssignableFrom(fieldType)){ Long[] result = new Long[paramLength]; for (int i = 0; i < paramLength; i++){ result[i] = Long.parseLong(paramValues[i]); } return result; }else if (long[].class.isAssignableFrom(fieldType)){ //怎么写?如果照般上面的代码,明显不行,因为 Object[].class 和 long[].class是不兼容的 } return paramValues; } public static void main(String[] args){ String[] paramValues = {"1", "2"}; A a = new A(); Class<?> fieldType1 = Long[].class; Object[] args1 = Util.getFieldValues(fieldType1, paramValues); A.class.getMethod("setIds1", fieldType1).invoke(a, new Object[]{args1}); Class<?> fieldType2 = long[].class; Object[] args2 = Util.getFieldValues(fieldType2, paramValues); A.class.getMethod("setIds2", fieldType2).invoke(a, new Object[]{args2});// 如何让它正常运行成功? } }
问题: 如何让第二个反射成功执行? 可以修改工具类方法的返回值,其实怎么改都可以,只要能让Long[] 和long[]都被成功反射执行到目标方法就可以了.
谢谢各位了, 这个问题我昨晚想了一夜了, PS: 要求一定要使用工具类方法的方式,因为我想要复用.不能下面这种:
if (Long[].class)
method.invoke(a, Long[] instance);
else if (long[].class)
method.invoke(a, long[] instance);
拜托各位啦.
2012年2月10日 14:03
目前还没有答案
相关推荐
调用基本类型数组参数的方法时,情况会稍复杂,因为数组在Java中被视为对象。假设我们有一个接受`int[]`的方法: ```java Method method = MyClass.class.getMethod("myMethodWithIntArray", int[].class); method....
在这个主题中,我们将深入探讨如何使用Java反射来调用不同类型的参数方法,包括无参方法、Object类型参数的方法、基本类型参数的方法以及数组参数的方法,以及如何调用私有方法。 首先,要调用无参方法,我们可以...
13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 System.String类型 14.2.1 构造字符串 14.2.2 ...
`Method`类的`invoke()`方法是反射的核心,它接受两个参数:一个是被调用方法的对象实例,另一个是包含方法参数的数组。注意,如果参数是基本类型,必须转换成对应的包装类对象。`invoke()`方法的返回值也是对象,...
2. **调用方法**:`invoke()`方法允许我们在运行时调用指定对象上的方法,它接受一个对象(如果是静态方法可以为null)和一个参数数组,返回方法的执行结果。如果方法抛出异常,`invoke()`会把异常封装成`Invocation...
- 基本类型:反射可以处理包装类,但无法直接处理原始类型。 - 字段:通过`Field`对象可以读写私有和静态字段。 - 方法:`Method`对象表示类的方法,允许调用静态或实例方法,包括私有方法。 - 构造器:`...
5. **使用基本类型包装类的TYPE语法**:这种方式适用于获取基本类型的Class对象。例如: ```java Class<?> c = int.class; Class<?> d = double.class; ``` #### 五、动态生成实例 在反射机制中,有几种不同的...
- 基本类型的包装类提供的`TYPE`属性:例如`Integer.TYPE`表示`int`类型。 #### 五、实例化对象 通过反射可以实例化对象,主要有两种方式: 1. **Class类的newInstance()方法**:直接通过`Class`对象创建实例。 ...
- 当方法需要接收数组作为参数时,可以使用`Array.newInstance()`创建数组,并将其传递给反射调用的方法。 ##### 8. 数组与Object的关系及其反射类型 - 在Java中,数组也是一种对象,可以通过反射创建和操作数组。 ...
5. **自动装箱与拆箱**:Java自动将基本类型与对应的包装类进行转换,这就是自动装箱和拆箱。对于-128到127之间的数值,Integer对象会在缓存中复用,因此相同数值的对象会引用同一个对象。 6. **异常处理**:Java...
- `args`是一个字符串数组,作为主方法的参数传递给程序。它主要用于接收命令行参数。 **&和&&的区别** - `&`是按位与操作符,同时也是一个逻辑与操作符。 - `&&`是短路逻辑与操作符。当左侧表达式为false时,右侧...
可以使用Character类的getNumericValue方法或者通过包装类(如Integer.parseInt)来转换。 23. 如何将数字转换为字符? 数字可以通过String类的静态方法valueOf转换成字符串,再使用charAt方法取得特定位置的字符。...
3. 自动装包/拆包(Autoboxing/Unboxing):JDK 1.5引入了自动装包和拆包功能,使得基本类型和它们对应的包装类之间可以无缝转换。例如,可以将int转换为Integer,反之亦然,无需手动调用构造函数或valueOf()方法。...
13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 System.String类型 14.2.1 构造字符串 14.2.2 ...
13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 System.String类型 14.2.1 构造字符串 14.2.2 ...
这些参数被包装成一个数组,使得方法可以处理任意数量的参数。 #### 25. 反射的概念? 反射是C#的一个强大特性,允许在运行时检查和修改类型的信息。通过反射,代码可以获取类型、方法、属性等的元数据,甚至创建...
13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 System.String类型 14.2.1 构造字符串 14.2.2 ...
- `Integer`是`int`的包装类,可以表示null。 #### 57. 运行时异常与一般异常有何异同? - **运行时异常**:通常是由程序错误引起的,如数组越界。 - **一般异常**:通常是由外部因素引起的,如文件不存在。 - ...
`params`关键字允许方法接受可变数量的参数,这些参数在调用时会被包装成一个数组。这为调用者提供了灵活性,可以传入任意数量的相同类型的参数。 ### 25. 反射的定义 反射是C#的一项强大功能,它允许程序在运行时...