美文网首页
Java,立即数的类型强转导致反射找不到方法

Java,立即数的类型强转导致反射找不到方法

作者: wizdzz | 来源:发表于2019-01-22 15:14 被阅读0次

工作需要用到类方法的反射调用,网上找到这样一段代码:

public static Object invokeMethod(Object object, String methodName, Class[] parameterTypes, Object... parameters) {
        //根据 对象、方法名和对应的方法参数 通过反射 调用上面的方法获取 Method 对象
        Method method = getDeclaredMethod(object, methodName, parameterTypes);

        //抑制Java对方法进行检查,主要是针对私有方法而言
        method.setAccessible(true) ;

        try {
            if(null != method) {
                //调用object 的 method 所代表的方法,其方法的参数是 parameters
                return method.invoke(object, parameters) ;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

哎,既然后面传入了 parameters,那么 parameterTypes 直接 parameters.getClass() 就好了,何必再传;
于是稍加修改,该方法变成这个样子:

public static Object invokeMethod(Object object, String methodName, Object... parameters) {
        //根据 对象、方法名和对应的方法参数 通过反射 调用上面的方法获取 Method 对象
        Class[] parameterTypes = new Class[parameters.length];

        for(int i = 0; i < parameters.length; i++){
            parameterTypes[i] = parameters[i].getClass();
        }

        Method method = getDeclaredMethod(object, methodName, parameterTypes);

        //抑制Java对方法进行检查,主要是针对私有方法而言
        method.setAccessible(true) ;

        try {
            if(null != method) {
                //调用object 的 method 所代表的方法,其方法的参数是 parameters
                return method.invoke(object, parameters) ;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

嗯,不禁为自己的机智点赞;
于是加入工程,跑起来,哎,怎么反射找不到方法;
仔细观察,调用时的代码是 ClassReflectionUtils.invokeMethod(obj, "func", 123);
调试步进,观察 paramters,发现变成了 Integer 类型;


原来立即数会被强转为这种“高级立即数类”;
那么再测试一下:

public static void fun(Object... args){
        for(Object object : args){
            Class xx = object.getClass();
            System.out.println(xx);
        }
        return;
    }

public static void main(String[] args) {
    int m = 1;
    double n = 2.3;
    fun(m, n);
}

得到了如下输出:


嗯,看来确实会被强转,那么 invokeMethod 的 parameterTypes 参数是不可省略了,再恢复之前的 invokeMethod ,跑起来,成功了。
其实省略该参数还有一个问题,当 parameters.getClass() 为子类,而指定 method 中需要的父类时,findMethod 应该也找不到方法,这里感兴趣的读者可以自行测试一下。

相关文章

  • Java,立即数的类型强转导致反射找不到方法

    工作需要用到类方法的反射调用,网上找到这样一段代码: 哎,既然后面传入了 parameters,那么 parame...

  • java反射实现

    java反射为什么比较慢?reflect的性能开销: 变长方法参数导致导致的Object数组 基本类型自动装箱拆箱...

  • Java 高级基础——反射

    Java 高级基础——反射 反射的意义:Java 强类型语言,但是我们在运行时有了解、修改信息的需求,包括类信息、...

  • Java基础--反射

    什么是Java反射 概念 java反射是指java能够在运行时确定类的类型信息,包括其方法、字段、构造函数等,并能...

  • Java 反射理解(三)-- Java获取方法信息

    Java 反射理解(三)-- Java获取方法信息 基本的数据类型、void关键字,都存在类类型。 举例如下: C...

  • 反射机制案例

    在Java中,可以利用反射获取指定类型的公有/私有属性、方法,生成该类的实例对象,并调用该对象的方法。 以下反射相...

  • Java 反射机制

    [1]. java反射详解[2]. Java Reflection(反射机制)详解[3]. 深入理解Java类型...

  • 反射

    反射(Reflection) 可以在运行时加载,使用未知的包,类,方法等等 弥补强类型语言的不足 基于反射创建对象...

  • Java反射-基于ParameterizedType实现泛型类类

    反射机制是Java的一个非常实用的特性. 基于反射, 我们可以实现下面的接口 将类型作为参数传入方法中, 方法可以...

  • Java反射机制中getFields和getDeclareFie

    在java反射机制中,代表java类型的Class对象有两个获得类字段的方法getFields和getDec...

网友评论

      本文标题:Java,立即数的类型强转导致反射找不到方法

      本文链接:https://www.haomeiwen.com/subject/csgljqtx.html