gpt4 book ai didi

java - 使用 Java 反射创建原始类型/对象

转载 作者:行者123 更新时间:2023-11-30 07:02:44 26 4
gpt4 key购买 nike

我正在尝试创建一个对象创建器,它要求用户输入,然后创建一个对象。我有一个给定类的构造函数数组,通过这些构造函数,我让用户选择一个,如果该构造函数有参数,我希望用户动态设置这些参数。

使用来自 java.lang.reflect.Constructor 的构造函数列表;如下:

constructorList[0].getGenericParameterTypes()[0]

这将返回一个“类型”数组

是否可以创建该类型的实例并由用户赋予某些值?假设它是一个 int 类型,如果我希望该 int 为 10 --(我知道这行不通,但理论上)

constructorList[0].getGenericParameterTypes()[0] intValue = 10;

如果它是一个对象,我可以从 Type 获取类,并且...我想我可以对我正在创建的对象创建器进行递归调用,是否有一种简单的方法来创建该对象的新实例,因为我觉得这可能会进入一个永无休止的递归循环。

最佳答案

总的来说,我没有看到基元有任何基本问题。尽管您应该考虑到, 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);
}
}

关于java - 使用 Java 反射创建原始类型/对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40619986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com