gpt4 book ai didi

java - 如何创建 "dynamic(decided at runtime)"类的实例?

转载 作者:行者123 更新时间:2023-11-30 07:51:24 24 4
gpt4 key购买 nike

我有几个类,例如 MyClassA MyClassB MyClassC 和 MyClassD

我想要一个给定 Class 类型的函数,该函数将创建(并执行任何操作......)一个作为该类实例的对象。

所以我的函数看起来像这样,

public void foo(ClassType MyChoosenClassType){
MyChoosenClassType x=new MyChoosenClassType();
//do whatever with x
}

有什么办法可以做到这一点吗?

或者我是否必须使用 if 条件和我自己的方式手动完成所有操作?

最佳答案

您可以使用 Java Reflection API 来完成此操作,方法是使用 Class.getConstructor()Constructor.newInstance()方法:

public <T extends MyClassParent> void foo(Class<T> classType) throws Exception {
T instance = (T) classType.getConstructor().newInstance(); // no-args constructor assumed

// work with instance, which is a subclass of MyClassParent
}

只要 MyClassParent 的所有子类都有无参数构造函数,这就可以工作。如果它们都有另一个构造函数,您可以将预期参数的类传递给 Class.getConstructor(),并将实际参数值传递给 Constructor.newInstance()。请参阅文档了解更多详细信息。

但是,使用 Java 8,您可以避免使用反射:

Map<String, Supplier<? extends MyClassParent>> facotries = new HashMap<>();

factories.put("MyChosenClassType1", MyChosenClassType1::new);
factories.put("MyChosenClassType2", MyChosenClassType2::new);
// etc

然后,您可以按如下方式实现 foo 方法:

public void foo(String classType) {
Supplier<? extends MyClassParent> factory = factories.get(classType);
if (factory != null) {
MyClassParent instance = factory.get();

// work with instance
}
}

关于java - 如何创建 "dynamic(decided at runtime)"类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33302310/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com