【问题标题】:Creating primitive types/objects using Java Reflection使用 Java 反射创建原始类型/对象
【发布时间】:2017-03-29 22:25:36
【问题描述】:

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

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

constructorList[0].getGenericParameterTypes()[0]

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

是否可以在用户给定一些值的情况下创建这种类型的实例?说它是一个 int 类型,如果我希望那个 int 是 10 ——(我知道这行不通,但理论上)

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

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

【问题讨论】:

    标签: java class object reflection types


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-03-30
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多