将数字对象自动转换为其本机

时间:2015-01-14 01:20:25

标签: java reflection

我正在尝试创建一个函数,该函数将在给定一组参数的情况下调用类的构造函数     包testytest;

import java.lang.reflect.Constructor;

public class MainClass {

    public static <T> T newClass(Class<?> inst, Object ... args){
        @SuppressWarnings("unchecked")
        Constructor<?> [] ctor = (inst.getDeclaredConstructors());
        int argIndex = 0;
        ctorLoop: for(Constructor<?> x : ctor){
            argIndex = 0;
            for(Class<?> s : x.getParameterTypes()){
                if(argIndex > args.length || args[argIndex++].getClass() != s){
                    if(argIndex <= args.length)
                    System.out.println("Param doesnt match : " + args[argIndex-1].getClass() + " with " + s);
                    continue ctorLoop;
                }
            }
            try{
                return (T)x.newInstance(args);
            }catch(Exception e){
                System.err.println("Error in instantiating instance of class : " + inst);
                return null;
            }
        }
        System.err.println("No instance of constructor found for class " + inst);
        return null;
    }

    public static void main(String[] args) {
        System.out.println(newClass(Double.class,5.0));

    }

}

给了我错误

Param doesnt match : class java.lang.Double with double
Param doesnt match : class java.lang.Double with class java.lang.String
No instance of constructor found for class class java.lang.Double

看着这条线

Param doesnt match : class java.lang.Double with double

有没有办法本机地进行这个布尔匹配,而不需要交换每个本机类型(double,float,long,int等?)

3 个答案:

答案 0 :(得分:2)

在包装器类中定义了常量,这些常量表示基元类型的Class对象。对于double,请使用Double.TYPE

  

表示基本类型Class的{​​{1}}实例。

这应该与您正在寻找的构造函数的假定double参数匹配。

其他原语的其他示例包括doubleInteger.TYPEFloat.TYPEShort.TYPEByte.TYPELong.TYPE和{{1} }。 Character.TYPE甚至Boolean.TYPE

答案 1 :(得分:1)

不,没有。引用类型java.lang.Double和基元类型double都具有相应的Class个对象。没有办法从一个Class对象转到另一个(装箱/拆箱)。

你必须保留自己的(bi)地图。

答案 2 :(得分:0)

执行此操作的简单方法是使用java.beans.Statement。它会自动为您处理所有这些转换。