使用Java反射创建基本类型/对象



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

使用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);
    }
}

相关内容

  • 没有找到相关文章

最新更新