0 0

关于包装类数组作为方法参数类型时,反射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方法反射调用demo

    调用基本类型数组参数的方法时,情况会稍复杂,因为数组在Java中被视为对象。假设我们有一个接受`int[]`的方法: ```java Method method = MyClass.class.getMethod("myMethodWithIntArray", int[].class); method....

    Java反射方法调用

    在这个主题中,我们将深入探讨如何使用Java反射来调用不同类型的参数方法,包括无参方法、Object类型参数的方法、基本类型参数的方法以及数组参数的方法,以及如何调用私有方法。 首先,要调用无参方法,我们可以...

    CLR.via.C#.(中文第3版)(自制详细书签)Part2

    13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 System.String类型 14.2.1 构造字符串 14.2.2 ...

    java反射之动态代理

    `Method`类的`invoke()`方法是反射的核心,它接受两个参数:一个是被调用方法的对象实例,另一个是包含方法参数的数组。注意,如果参数是基本类型,必须转换成对应的包装类对象。`invoke()`方法的返回值也是对象,...

    解析Java中的Field类和Method类

    2. **调用方法**:`invoke()`方法允许我们在运行时调用指定对象上的方法,它接受一个对象(如果是静态方法可以为null)和一个参数数组,返回方法的执行结果。如果方法抛出异常,`invoke()`会把异常封装成`Invocation...

    Java-Reflection-Tutorial.pdf

    - 基本类型:反射可以处理包装类,但无法直接处理原始类型。 - 字段:通过`Field`对象可以读写私有和静态字段。 - 方法:`Method`对象表示类的方法,允许调用静态或实例方法,包括私有方法。 - 构造器:`...

    Java反射机制

    5. **使用基本类型包装类的TYPE语法**:这种方式适用于获取基本类型的Class对象。例如: ```java Class&lt;?&gt; c = int.class; Class&lt;?&gt; d = double.class; ``` #### 五、动态生成实例 在反射机制中,有几种不同的...

    java反射机制简介

    - 基本类型的包装类提供的`TYPE`属性:例如`Integer.TYPE`表示`int`类型。 #### 五、实例化对象 通过反射可以实例化对象,主要有两种方式: 1. **Class类的newInstance()方法**:直接通过`Class`对象创建实例。 ...

    java加强笔记

    - 当方法需要接收数组作为参数时,可以使用`Array.newInstance()`创建数组,并将其传递给反射调用的方法。 ##### 8. 数组与Object的关系及其反射类型 - 在Java中,数组也是一种对象,可以通过反射创建和操作数组。 ...

    java学习笔记

    5. **自动装箱与拆箱**:Java自动将基本类型与对应的包装类进行转换,这就是自动装箱和拆箱。对于-128到127之间的数值,Integer对象会在缓存中复用,因此相同数值的对象会引用同一个对象。 6. **异常处理**:Java...

    Java经典问题答案(带书签).pdf

    - `args`是一个字符串数组,作为主方法的参数传递给程序。它主要用于接收命令行参数。 **&和&&的区别** - `&`是按位与操作符,同时也是一个逻辑与操作符。 - `&&`是短路逻辑与操作符。当左侧表达式为false时,右侧...

    2014年Java最全面试题以及答案.

    可以使用Character类的getNumericValue方法或者通过包装类(如Integer.parseInt)来转换。 23. 如何将数字转换为字符? 数字可以通过String类的静态方法valueOf转换成字符串,再使用charAt方法取得特定位置的字符。...

    JDK1.5和1.6新增特性[借鉴].pdf

    3. 自动装包/拆包(Autoboxing/Unboxing):JDK 1.5引入了自动装包和拆包功能,使得基本类型和它们对应的包装类之间可以无缝转换。例如,可以将int转换为Integer,反之亦然,无需手动调用构造函数或valueOf()方法。...

    CLR.via.C#.(中文第3版)(自制详细书签)Part1

    13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 System.String类型 14.2.1 构造字符串 14.2.2 ...

    CLR.via.C#.(中文第3版)(自制详细书签)

    13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 System.String类型 14.2.1 构造字符串 14.2.2 ...

    C#基础概念二十五问

    这些参数被包装成一个数组,使得方法可以处理任意数量的参数。 #### 25. 反射的概念? 反射是C#的一个强大特性,允许在运行时检查和修改类型的信息。通过反射,代码可以获取类型、方法、属性等的元数据,甚至创建...

    CLR.via.C#.(中文第3版)(自制详细书签)Part3

    13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 System.String类型 14.2.1 构造字符串 14.2.2 ...

    Java面试题以及答案

    - `Integer`是`int`的包装类,可以表示null。 #### 57. 运行时异常与一般异常有何异同? - **运行时异常**:通常是由程序错误引起的,如数组越界。 - **一般异常**:通常是由外部因素引起的,如文件不存在。 - ...

    C#基本概念二十五问.pdf

    `params`关键字允许方法接受可变数量的参数,这些参数在调用时会被包装成一个数组。这为调用者提供了灵活性,可以传入任意数量的相同类型的参数。 ### 25. 反射的定义 反射是C#的一项强大功能,它允许程序在运行时...

Global site tag (gtag.js) - Google Analytics