You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 17:33:23