赵玉顺 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 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化