我试图创建一个对象创建者,要求用户输入,然后创建一个对象。对于给定的类,我有一个构造函数数组,通过这些构造函数,我让用户选择一个,如果该构造函数有参数,我希望用户能够动态地设置这些参数。
使用java.lang.reflect.Constructor;下面给出:
constructorList[0].getGenericParameterTypes()[0]
返回一个'Type'数组
是否有可能创建一个由用户给定值的这种类型的实例?假设它是int类型,如果我想让int值为10——(我知道这行不通,但理论上)
constructorList[0].getGenericParameterTypes()[0] intValue = 10;
如果它是一个对象,我可以从Type和…我想我可以递归调用我正在创建的objectcreator,是否有一种简单的方法来创建该对象的新实例,因为我觉得这可以进入一个永无止境的递归循环
一般来说,我认为原语没有任何根本问题。虽然你应该考虑到,Type
是一个非常抽象的声明,所以它不仅包括具体的类,还包括参数变量,参数化类型等。我想,记住原语是非常特定的类型(类),它们不是显式构造的(因为它们在代码中被声明为在内存中"按值"处理),这将是有用的;所以我猜,他们的"盒装"版本将被使用。
尽管您应该考虑,类型检查将不会应用,所以您需要手动确保所有输入都是有效的,并且正确地强制转换方法结果。
下面是一个示例代码,可能会给你一些启发:
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String typeName = s.next();
//ask for type
Class<?> type;
try {
type = Class.forName(typeName);
} catch (ClassNotFoundException e) {
System.out.printf("Class `%s` was not found%n", typeName);
return;
}
//discover constructors
Constructor<?>[] constructors = type.getConstructors();
for (int i = 0; i < constructors.length; ++i) {
System.out.printf(" > %d %s%n", i, constructors[i]);
}
//select constructor and list its parameters
int constructorIndex = s.nextInt();
Constructor<?> constructor = constructors[constructorIndex];
Type[] parameterTypes = constructor.getGenericParameterTypes();
for (Type parameterType : parameterTypes) {
System.out.println(parameterType);
//each type implementation requires a specific processing
if (parameterType instanceof Class) {
Class parameterClass = (Class) parameterType;
if ((parameterClass).isPrimitive()) {
//simple int primitive; which can be directly obtained from scanner
if (Integer.TYPE.isAssignableFrom(parameterClass)) {
System.out.println("tinteger primitive > ");
int value = s.nextInt();
System.out.println("t you've entered " + value);
}
} else {
Stream.of((parameterClass).getConstructors()).forEach(c -> System.out.printf("t%s%n", c));
Stream.of((parameterClass).getDeclaredConstructors()).forEach(c -> System.out.printf("t%s%n", c));
}
}
}
// here we consider a sample java.lang.Integer class was requested with #0 constructor
if (Integer.class.isAssignableFrom(type) && constructorIndex == 0) {
System.out.println("Input an integer number: ");
String value = s.next();
// since newInstance requires array of objects, we need to create an object (not primitive)
Object instance;
try {
instance = constructor.newInstance(Integer.valueOf(value));
} catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
return;
}
System.out.printf("%s %s%n", instance.getClass(), instance);
}
}