我尝试在类类之外创建一个对象(通过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;
}
答案 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
}
}
...
请注意,上述内容并不完整,扫描仪有更多方法可以读取其他类型,我没有在这里显示。
读取其他类型参数的最佳策略可能是将它们作为字符串读取,并通过某种工厂方法将它们转换为相应的对象。