Java - 使用Reflection创建新实例,而不需要知道构造函数参数

时间:2012-12-07 19:45:32

标签: java reflection

我需要创建许多类的新实例。我正在使用反射但是当我创建c.newInstance()时,没有'empty parameter constructor'的类会抛出java.lang.InstantiationException。

现在,我该如何创建每个类的实例?

我知道我可以使用c.getConstructor(Class).newinstance(params)创建没有'空参数构造函数'的类的实例,但我不知道每个类的参数。

还有一件事,所有这些类都扩展自另一个名为ParentClass的类,因此我可以使用的一种解决方法是在ParentClass中包含一些强制子类实现“空参数构造函数”的代码,但不要知道怎么做。

提前致谢!

3 个答案:

答案 0 :(得分:9)

您可以调用Class.getConstructors()来获取给定类的所有构造函数。

在每个Constructor上,您可以致电Constructor.getGenericParameterTypes()了解其预期的参数。

答案 1 :(得分:3)

你做不到。没有办法“需要”无参数构造函数并由编译器强制执行,并且根据定义创建类的实例,您必须为其提供必要的参数,否则您最终会得到一个违反该参数的对象。 class contract(因为它没有正确初始化)。

在代码级别强制执行此操作的正确方法是使用对象工厂和接口。我假设您必须使用反射,因为您在编译时不了解类型;在这种情况下,还应该有一个“工厂”知道如何生成每种类型的实例。应该使用有问题的类型构建/编译此工厂,以便它知道并可以调用正确的构造函数。然后,Factory会实现一个代码可以识别的接口,例如“ObjectFactory”,它允许您委托工厂实例化对象。然后,您将拥有一些对象工厂可以用来注册的方法,以便对它可以实例化的任何类型负责。

在您尝试创建的类附带的代码中:

static {
    FactoryRegistry.register(TypeA.class, new TypeAFactory());
}

在您的代码中:

Class<?> unknownClass = ...;
Object obj = FactoryRegistry.getFactory(unknownClass).newInstance();

(你有一个Factory接口TypeAFactory实现并指定newInstance方法)

您不知道unknownClass是什么或如何实例化它,但如果该类附带的代码注册了工厂,您可以查询该工厂并​​要求它为您创建对象。如果unknownClass确实是TypeA.class,则注册表将返回已注册的TypeAFactory以创建对象。


或者,您可以要求您的框架动态加载的任何代码的作者都包含无参数构造函数。它没有严格执行,但作者可以更容易实现。

答案 2 :(得分:2)

有两种用于创建类实例的反射方法java.lang.reflect.Constructor.newInstance()Class.newInstance()

Class.newInstance()只能调用零参数构造函数,而

无论参数的数量是多少,Constructor.newInstance()都可以调用任何构造函数。