首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java反射使用基元类型调用构造函数

Java反射使用基元类型调用构造函数
EN

Stack Overflow用户
提问于 2010-10-13 23:56:52
回答 6查看 35.9K关注 0票数 53

我的测试框架中有一个方法,它根据传入的参数创建一个类的实例:

代码语言:javascript
复制
public void test(Object... constructorArgs) throws Exception {
    Constructor<T> con;
    if (constructorArgs.length > 0) {
        Class<?>[] parameterTypes = new Class<?>[constructorArgs.length];
        for (int i = 0; i < constructorArgs.length; i++) {
            parameterTypes[i] = constructorArgs[i].getClass();  
        }
        con = clazz.getConstructor(parameterTypes);
    } else {
        con = clazz.getConstructor();
    }
}

问题是,如果构造函数有原语类型,这就不起作用了,如下所示:

代码语言:javascript
复制
public Range(String name, int lowerBound, int upperBound) { ... }

.test("a", 1, 3);

结果如下:

代码语言:javascript
复制
java.lang.NoSuchMethodException: Range.<init>(java.lang.String, java.lang.Integer, java.lang.Integer)

原语int被自动装箱到对象版本中,但是我如何让它们返回以调用构造函数呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-10-13 23:59:26

使用Integer.TYPE而不是Integer.class

根据Javadocs,这是“表示原始类型int的类实例”。

您也可以使用int.class。这是Integer.TYPE的快捷方式。不仅仅是类,甚至对于原始类型,您可以在Java语言中使用type.class

票数 151
EN

Stack Overflow用户

发布于 2010-10-13 23:59:47

要引用基元类型,请使用以下命令:

代码语言:javascript
复制
Integer.TYPE;

您需要知道传递给您的方法的哪些参数是原始值。您可以使用以下命令来完成此操作:

代码语言:javascript
复制
object.getClass().isPrimitive()
票数 21
EN

Stack Overflow用户

发布于 2013-08-09 06:00:11

由于原语类型是自动装箱的,因此getConstructor(java.lang.Class<?>... parameterTypes)调用将失败。您将需要手动循环遍历可用的构造函数。如果所有类型都匹配,那么就没问题。如果某些类型不匹配,但所需的类型是原语,而可用的类型是相应的包装器类,则可以使用该构造函数。请参见以下内容:

代码语言:javascript
复制
static <C> Constructor<C> getAppropriateConstructor(Class<C> c, Object[] initArgs){
    if(initArgs == null)
        initArgs = new Object[0];
    for(Constructor con : c.getDeclaredConstructors()){
        Class[] types = con.getParameterTypes();
        if(types.length!=initArgs.length)
            continue;
        boolean match = true;
        for(int i = 0; i < types.length; i++){
            Class need = types[i], got = initArgs[i].getClass();
            if(!need.isAssignableFrom(got)){
                if(need.isPrimitive()){
                    match = (int.class.equals(need) && Integer.class.equals(got))
                    || (long.class.equals(need) && Long.class.equals(got))
                    || (char.class.equals(need) && Character.class.equals(got))
                    || (short.class.equals(need) && Short.class.equals(got))
                    || (boolean.class.equals(need) && Boolean.class.equals(got))
                    || (byte.class.equals(need) && Byte.class.equals(got));
                }else{
                    match = false;
                }
            }
            if(!match)
                break;
        }
        if(match)
            return con;
    }
    throw new IllegalArgumentException("Cannot find an appropriate constructor for class " + c + " and arguments " + Arrays.toString(initArgs));
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3925587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档