java - 我怎么知道自动装箱后是否是原始类型?

标签 java reflection autoboxing

我知道已经有很多关于反射和原始类型的问题,但我并没有真正得到我搜索过的确切信息。 我的问题如下: 我想(通过反射)完全动态地调用方法,这意味着我想调用它们,即使我不完全知道参数的类型。

public Object invoke(Object objectContainingMethod,String methodName, Object...params) {
    Object result = null;
    int length = params.length;
    Class<?>[] paramTypes = new Class<?>[length];

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

    try {
        Method method = objectContainingMethod.getClass().getMethod(methodName, paramTypes);
        // not hard coded like getMethod(methodName, String.class, int.class, double.class);
        result = method.invoke(objectContainingMethod, params);
    } catch (NoSuchMethodException | SecurityException | 
             IllegalAccessException | IllegalArgumentException | 
             InvocationTargetException e) { 
        e.printStackTrace();
    }

    return result;
}

(还没有优化任何东西,所以请不要讨厌^^) 问题是,该方法的参数需要在 Object 中转换,但是当我这样做时,由于自动装箱,您无法再检测它是否是原始类型。 当我尝试使用 int 参数从类 String 调用方法“charAt”时会发生这种情况:

String instance = "hello";
Object result = invoke(instance,"charAt",0);

这显然会导致:

java.lang.NoSuchMethodException: java.lang.String.charAt(java.lang.Integer)
at java.lang.Class.getMethod(Unknown Source)...

由于自动装箱,他搜索了 Integer 而不是 int。 那么我在这里要做的事情有解决办法吗?我知道如何检测原始类型,但不知道当它们被自动装箱到它们的包装器类型时。非常感谢任何帮助。

最佳答案

您必须将一个类数组作为参数传递给您的自定义 invoke 方法,该方法具有要在方法签名中搜索的显式类型,而不是尝试直接从参数中确定类型.这正是 Class.getMethod(String, Class[]) 需要类型而不是从参数推断的原因。

将您的签名更改为类似这样的内容。直接使用类数组,而不是推断类型。或者,您可以使用 Collection 而不是数组,这仅作为示例。

public Object invoke(Object objectContainingMethod,String methodName, Class<?>[] types, Object...params)

关于java - 我怎么知道自动装箱后是否是原始类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18742933/

相关文章:

java - 通过 Java 三元运算符的自动装箱行为引发 NullPointerException

java - Java中如何将int[]转换为List<Integer>?

java - Hibernate DefaultEntityAliases 引发 NullPointerException

go - 从reflect.Value(foo)获取reflect.Value(&foo)

java - 数字提升和平等?

c# - 使用反射在 C# 中设置索引属性的值

java - Thread.stop() - 已弃用

java - 这是找出java函数渐近复杂度的正确方法吗?

java - Spring Security + LDAP 总是返回 BadCredentialsException