MST
星途 面试题库

面试题:Java类定义与实例化:反射机制的深度应用

使用Java反射机制,在运行时根据用户输入的类名来实例化一个类,并且该类的构造函数带有参数。假设这些参数类型和值也由用户输入,你需要处理可能出现的各种异常情况,例如类不存在、构造函数不匹配等。请写出完整的代码实现。
34.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Scanner;

public class ReflectiveInstantiation {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        try {
            // 获取类名
            System.out.println("请输入类名:");
            String className = scanner.nextLine();

            // 获取构造函数参数类型和值
            System.out.println("请输入构造函数参数个数:");
            int paramCount = scanner.nextInt();
            scanner.nextLine(); // 清除换行符

            Class<?>[] paramTypes = new Class[paramCount];
            Object[] paramValues = new Object[paramCount];

            for (int i = 0; i < paramCount; i++) {
                System.out.println("请输入第 " + (i + 1) + " 个参数的类型 (如 java.lang.String):");
                String paramTypeName = scanner.nextLine();
                paramTypes[i] = Class.forName(paramTypeName);

                System.out.println("请输入第 " + (i + 1) + " 个参数的值:");
                if (paramTypes[i] == int.class) {
                    paramValues[i] = scanner.nextInt();
                    scanner.nextLine(); // 清除换行符
                } else if (paramTypes[i] == double.class) {
                    paramValues[i] = scanner.nextDouble();
                    scanner.nextLine(); // 清除换行符
                } else {
                    paramValues[i] = scanner.nextLine();
                }
            }

            // 使用反射实例化对象
            Class<?> clazz = Class.forName(className);
            Constructor<?> constructor = clazz.getConstructor(paramTypes);
            Object instance = constructor.newInstance(paramValues);

            System.out.println("实例化成功: " + instance);
        } catch (ClassNotFoundException e) {
            System.out.println("类不存在: " + e.getMessage());
        } catch (NoSuchMethodException e) {
            System.out.println("构造函数不匹配: " + e.getMessage());
        } catch (InvocationTargetException | InstantiationException | IllegalAccessException e) {
            System.out.println("实例化失败: " + e.getMessage());
        }
    }
}