如何在Java数组中存储不同类类型的引用以创建实例
在Java中存储类引用并创建对象的实现方式
Java里没法直接像你示例里那样new array_of_classes[0](),但可以通过两种常用方式实现类似需求:
方法一:使用Class对象数组
每个Java类都对应一个Class实例,你可以把这些实例存入数组,再通过反射创建对象。
示例代码
// 定义你的类(确保有无参构造方法) class A {} class B {} class C {} // 存储类的Class对象到数组 Class<?>[] arrayOfClasses = {A.class, B.class, C.class}; // 通过反射创建对象 try { Object aInstance = arrayOfClasses[0].getDeclaredConstructor().newInstance(); System.out.println(aInstance.getClass().getSimpleName()); // 输出 "A" Object bInstance = arrayOfClasses[1].getDeclaredConstructor().newInstance(); System.out.println(bInstance.getClass().getSimpleName()); // 输出 "B" } catch (Exception e) { // 处理反射相关异常(比如无参构造不存在、权限问题等) e.printStackTrace(); }
注意:
Class.newInstance()在Java 9及以上已被标记为过时,推荐用getDeclaredConstructor().newInstance(),它能更明确地处理构造器的访问权限问题。
方法二:使用构造器引用(Java 8+)
如果你的类有共同的父类或实现了同一个接口,用构造器引用配合Supplier会更类型安全,还能避免反射的运行时异常。
示例代码
// 定义共同接口或父类 interface MyType {} // 让类实现该接口 class A implements MyType {} class B implements MyType {} class C implements MyType {} // 存储构造器引用到Supplier数组 Supplier<MyType>[] constructorSuppliers = (Supplier<MyType>[]) new Supplier[] { A::new, B::new, C::new }; // 创建对象 MyType aInstance = constructorSuppliers[0].get(); System.out.println(aInstance.getClass().getSimpleName()); // 输出 "A" MyType cInstance = constructorSuppliers[2].get(); System.out.println(cInstance.getClass().getSimpleName()); // 输出 "C"
这种方式在编译阶段就能检查构造器是否存在,代码更简洁,类型安全性更高。
内容的提问来源于stack exchange,提问作者A. K.
相关产品推荐
相关产品推荐

