使用反射获取具有原始类型参数的类的方法

乔比·威尔逊·马修斯

我正在尝试使用反射获取类的方法,其中该方法的参数有时是原始类型或任何对象。

例子:

public class A {

public void display(short a){
    System.out.println(a);
    }

}

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import com.rexample.model.A;

public class ReflectionExample {

    public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        ReflectionExample example=new ReflectionExample();
        example.print();
    }

    public void print() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        String nameOfTheMethod="display";//Assume name of the method is display
        short v=10;//Assume primitive type is short
        Object value=v;
        Method method=A.class.getDeclaredMethod(nameOfTheMethod,value.getClass());
        method.invoke(new A(),value);
    }

}

我收到错误:

Exception in thread "main" java.lang.NoSuchMethodException: com.rexample.model.A.display(java.lang.Short)
    at java.lang.Class.getDeclaredMethod(Class.java:2130)
    at com.rexample.test.ReflectionExample.print(ReflectionExample.java:34)
    at com.rexample.test.ReflectionExample.main(ReflectionExample.java:27)

上面的代码只是我目前正在构建的更大程序的一个小例子,我无法获取参数类型short或任何其他原始类型的方法。

我无法在我的代码中直接使用 short.class 或 Short.TYPE ,因为我试图以更通用的方式来做。

有什么方法可以解决我的原始类型参数和任何对象的问题吗?

戴维xxx

实际上,您将值(对象或基元)分配给声明的类型Object

Object value=v;

作为v一个Object它是可以的,但因为它是一个原语,它是一个问题,因为在运行时 JVM 将它装箱到相应的包装器类。
所以在这里你丢失了原始信息v

method=A.class.getDeclaredMethod(nameOfTheMethod,value.getClass());

正确处理它的唯一方法是区分基元和对象。
您可以重载getType()来处理两者:

public Class<?> getType(Object o) {
    return o.getClass();
}

public Class<?> getType(short s) {
    return short.class;
}

public Class<?> getType(int i) {
    return int.class;
} 

// add overloads with other primitive types if required

这是一个通过反射进行两次调用的示例:一个使用原始参数,另一个使用对象参数。

一类

public class A {

    public void display(short a) {
        System.out.println("primitive " + a);
    }

    public void display(Short a) {
        System.out.println("Wrapper " + a);
    }
}

ReflectionExample 类

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectionExample {

    public static void main(String[] args)
            throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        ReflectionExample example = new ReflectionExample();
        example.print();
    }

    public void print() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        String nameOfTheMethod = "display";

        // primitive param call
        short s = 10;
        Method method = A.class.getDeclaredMethod(nameOfTheMethod, getType(s)); // invoke getType(short s)
        method.invoke(new A(), s); 

        // object param call
        Short sWrapper = 10;// Assume primitive type is short
        method = A.class.getDeclaredMethod(nameOfTheMethod, getType(sWrapper)); // invoke getType(Object o)
        method.invoke(new A(), sWrapper);
    }

    public Class<?> getType(short s) {
        return short.class;
    }

    public Class<?> getType(int i) {
        return int.class;
    }
    ... //

    public Class<?> getType(Object o) {
        return o.getClass();
    }

}

输出 :

原始 10

包装纸 10

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有原始类型的反射映射

来自分类Dev

具有原始类型的反射映射

来自分类Dev

获取枚举类型并创建该类型的列表,获取类类型并创建具有反射类型的列表

来自分类Dev

使用HashMap和反射来调用具有可变参数类型的方法

来自分类Dev

我可以使用强类型反射找到具有通用参数的方法吗?

来自分类Dev

使用反射从动态方法获取参数类型

来自分类Dev

飞镖,如何使用反射获取方法参数的通用类型?

来自分类Dev

具有多种参数类型的反射

来自分类Dev

具有多种参数类型的反射

来自分类Dev

使用反射具有参数调用内部类方法

来自分类Dev

使用反射调用具有参数的方法

来自分类Dev

使用Java反射调用具有通用参数的方法

来自分类Dev

如何通过参数类型获取具有反射的参数化集合?

来自分类Dev

Java反射:获取方法的返回参数的类型

来自分类Dev

使用有效获取数组参数的反射方法

来自分类Dev

使用有效获取数组参数的反射方法

来自分类Dev

获取错误:目标类必须声明具有匹配名称和参数类型的方法

来自分类Dev

使用Java反射获取类数组的类型

来自分类Dev

使用Java反射获取类数组的类型

来自分类Dev

在具有类型参数的函数中调用的类型类方法

来自分类Dev

Kotlin抽象类,具有泛型参数和使用类型参数的方法

来自分类Dev

通过反射调用具有Class <T>类型参数的私有方法

来自分类Dev

使用 Scala 反射从对象中获取原始字段的类型

来自分类Dev

具有原始类型但没有类型参数的ArrayList()中的get()方法行为

来自分类Dev

具有类型参数的案例类的加倍方法

来自分类Dev

具有基于方法类型的必需参数的Restler类

来自分类Dev

获取基于原始类型的反射类型

来自分类Dev

如果类引用原始类型,则所有访问通过ASM生成的类的构造函数的反射方法都将引发NoClassDefFoundError。

来自分类Dev

当类具有绑定的类型参数时使用绑定的通配符

Related 相关文章

  1. 1

    具有原始类型的反射映射

  2. 2

    具有原始类型的反射映射

  3. 3

    获取枚举类型并创建该类型的列表,获取类类型并创建具有反射类型的列表

  4. 4

    使用HashMap和反射来调用具有可变参数类型的方法

  5. 5

    我可以使用强类型反射找到具有通用参数的方法吗?

  6. 6

    使用反射从动态方法获取参数类型

  7. 7

    飞镖,如何使用反射获取方法参数的通用类型?

  8. 8

    具有多种参数类型的反射

  9. 9

    具有多种参数类型的反射

  10. 10

    使用反射具有参数调用内部类方法

  11. 11

    使用反射调用具有参数的方法

  12. 12

    使用Java反射调用具有通用参数的方法

  13. 13

    如何通过参数类型获取具有反射的参数化集合?

  14. 14

    Java反射:获取方法的返回参数的类型

  15. 15

    使用有效获取数组参数的反射方法

  16. 16

    使用有效获取数组参数的反射方法

  17. 17

    获取错误:目标类必须声明具有匹配名称和参数类型的方法

  18. 18

    使用Java反射获取类数组的类型

  19. 19

    使用Java反射获取类数组的类型

  20. 20

    在具有类型参数的函数中调用的类型类方法

  21. 21

    Kotlin抽象类,具有泛型参数和使用类型参数的方法

  22. 22

    通过反射调用具有Class <T>类型参数的私有方法

  23. 23

    使用 Scala 反射从对象中获取原始字段的类型

  24. 24

    具有原始类型但没有类型参数的ArrayList()中的get()方法行为

  25. 25

    具有类型参数的案例类的加倍方法

  26. 26

    具有基于方法类型的必需参数的Restler类

  27. 27

    获取基于原始类型的反射类型

  28. 28

    如果类引用原始类型,则所有访问通过ASM生成的类的构造函数的反射方法都将引发NoClassDefFoundError。

  29. 29

    当类具有绑定的类型参数时使用绑定的通配符

热门标签

归档