你不能。没有办法“要求”无参数构造函数并由编译器强制执行,并且根据定义,要创建类的实例,您必须为其提供必要的参数,否则您将得到一个违反类合同(因为它没有正确初始化)。
在代码级别强制执行此操作的正确方法是使用对象工厂和接口。我假设您必须使用反射,因为您在编译时不知道类型;在这种情况下,还应该有一个“工厂”,它知道如何生成每种类型的实例。该工厂应该使用相关类型构建/编译,以便它知道并可以调用正确的构造函数。然后,工厂实现您的代码知道的接口,例如“ObjectFactory”,它允许您委托给工厂以实例化对象。然后,您将拥有一些方法,对象工厂可以使用该方法注册为负责它可以实例化的任何类型。
在您尝试创建的类附带的代码中:
static {
FactoryRegistry.register(TypeA.class, new TypeAFactory());
}
在您的代码中:
Class<?> unknownClass = ...;
Object obj = FactoryRegistry.getFactory(unknownClass).newInstance();
(您有一个实现并指定方法的Factory
接口)TypeAFactory
newInstance
您不知道unknownClass
它是什么或如何实例化它,但如果该类附带的代码注册了一个工厂,您可以查询该工厂并要求它为您创建对象。如果unknownClass
是真的TypeA.class
,那么注册表将返回TypeAFactory
已注册的创建对象。
或者,您可以只要求您的框架动态加载的任何代码的作者都包含一个无参数的构造函数。它不是严格执行的,但作者可以更容易地实施。