从Constructor对象获取参数类型(Java Reflection)

时间:2016-04-05 19:24:20

标签: java reflection

我尝试在类类之外创建一个对象(通过java反射) - 用户选择一个构造函数,我需要读取这个构造函数的变量(它应该是一些基本类型)。 正如您现在所看到的,我的代码仅适用于整数参数。

如何动态识别当前参数的类型并从键盘读取?

 public static Object chooseConstr(Class cls) throws IllegalAccessException, InstantiationException, InvocationTargetException {
    Scanner keyboard = new Scanner(System.in);

    Constructor[] constructors = cls.getDeclaredConstructors();
    System.out.println("Choose constructor from the list: ");
    System.out.println(Arrays.toString(constructors));

    int constr = keyboard.nextInt();
    constr--;


    Object[] arguments=new Object[constructors[constr].getParameterCount()];

    for(int i=0; i<arguments.length; i++){
        System.out.println("Write argument #"+(i+1));
        arguments[i]=keyboard.nextInt();
    }


    Object object = constructors[constr].newInstance(arguments);

    System.out.println("Object created!");
    return object;
}

1 个答案:

答案 0 :(得分:1)

这很棘手。当然扫描仪有一些基本的方法可以读取某些类型,但如果你想阅读其他类型的参数,你必须找到一种方法来自己阅读。

为此,您可以使用Constructor.getParameterTypes()

...
Object[] arguments = new Object[constructors[constr].getParameterCount()];

Class<?>[] pTypes = constructors[constr].getParameterTypes();

for (int i = 0; i < arguments.length; i++) {
    System.out.println("Write argument #" + (i + 1) + ". Of type: "+pTypes[i].getName());

    if(pTypes[i].equals(int.class)) {               
        arguments[i] = keyboard.nextInt(); // read an int
    } else if(pTypes[i].equals(String.class)) {
        arguments[i] = keyboard.next(); // read a String
    } else {
        // custom read code for other types
    }
}
...

请注意,上述内容并不完整,扫描仪有更多方法可以读取其他类型,我没有在这里显示。

读取其他类型参数的最佳策略可能是将它们作为字符串读取,并通过某种工厂方法将它们转换为相应的对象。