2016-04-05 100 views
2

我尝试从类类中创建对象(通过java反射) - 用户选择构造函数,并且需要为此构造函数读取变量(它应该是一些原始类型)。现在你可以看到我的代码仅适用于整数参数。从构造函数对象(Java Reflection)中获取参数类型

如何动态地找出当前参数的类型并从键盘读取它?

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; 
} 

回答

0

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

对于这一点,你可以使用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 
    } 
} 
... 

注意的是,以上是不完整的,扫描仪有更多的方法来读取其他类型太,这是我没有在这里显示。

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

+0

我只注意到你只需要它用于原语,所以这应该比我说的更简单。请注意,它也可以适用于其他类型。 –

相关问题