赵玉顺 2022-01-14 02:37 采纳率: 100%
浏览 56
已结题

使用可变形参过程中,整数自动装箱转换成了Integer类型,导致反射过程中错误如何解决

使用可变形参过程中,整数自动装箱转换成了Integer类型,导致反射过程中错误如何解决?

public class FrameTest {
    public static void main(String[] args) {
        invoke("hello","charAt",3);
    }
    public static void invoke(Object obj, String methodName, Object ... params) {
        Method method = null;
        Class[] clas = new Class[params.length];
        for (int i = 0; i < params.length; i++) {
            clas[i] = params[i].getClass();
        }
        try {
            method = obj.getClass().getMethod(methodName,clas);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        try {
            method.invoke(obj,params);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

java.lang.NoSuchMethodException: java.lang.String.charAt(java.lang.Integer)

我的解答思路和尝试过的方法

我知道哪里出了问题,但是必须使用可变形参,无法避免自动装箱

我想要达到的结果

正确调用方法

  • 写回答

4条回答 默认 最新

  • 猿码叔叔 2022-01-14 09:38
    关注

    首先题主的目的很明显,就是利用一个可变参数,实现 invoke 和 getMethod 中各自需要的可变参数 (Class<?>)parameterTypes 和 (Object)args。题主需要注意:两者的类型不同,而 getMthod 阶段中的 parameterTypes 必须是 int.class 或 其他类型.class,经测试.getClass 是无法通过getMethod 这一步,也就无法获取该方法的示例,因此,下面的invoke也就必然空指针。所以楼主尽可能在调用 invoke 之前,想办法解决获取该类型的.class问题,就可以解决问题。也就是说:getMethod 中的可变参数是一个Class 数组,而数组中的元素都是 类型.class,而不是 类型.getClass。你可以自己 Debug看一下。
    或者你可以这么干

        public static void invoke(Object obj, String methodName, Object ... params) throws ClassNotFoundException {
            Method method = null;
            Class<?>[] args = null;
            Method[] declaredMethods = obj.getClass().getDeclaredMethods();
            for (Method declaredMethod : declaredMethods) {
                if(declaredMethod.getName().equals(methodName)) {
                    args = declaredMethod.getParameterTypes();
                    break;
                }
            }
            try {
                method = obj.getClass().getMethod(methodName,args);
                method.invoke(obj,params);
            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月22日
  • 已采纳回答 3月22日
  • 创建了问题 1月14日

悬赏问题

  • ¥15 我这模型写的不对吗?为什么lingo解出来的下面影子价格这一溜少一个变量
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波