2013-11-01 158 views
1

对于许多框架开发,我们需要通过从配置文件读取限定类名来实例化类。实例化一个没有默认构造函数的类

有不同的内省策略,专门的图书馆(如Objenesis)面向它。

但是,对于没有默认构造函数的类(重载),如果我们不知道重载构造函数的签名,我认为没有内省函数。非标准方法是使用sun.misc.Unsafe类来分配。这是我的理解。这是一个正确的理解?

然后有一个问题,因为超级类没有通过使用不安全实例化。但我认为不安全是最接近C代码的“新”操作符调用的,至少是其中的一部分。

所以问题是,我们是否有Java方法通过某种形式的内省来实例化一个对象,当我们唯一的信息是该类的限定名称(当然这存在于某个地方在类路径!)

+2

您可以随时检查可用的构造函数并查看是否有任何值可以传递给它们。依赖注入框架将为自动装配构造函数注入的对象执行此操作 - 假设您正在创建的对象大多需要来自代码库的其他对象,而不是像字符串这样的“通用”参数;并且DI容器也管理这些依赖关系,从而知道如何创建它们。 – millimoose

+0

你想获得初始化对象(调用构造函数)还是未初始化的对象(没有调用构造函数和初始化方法,字段有默认值(0或null)? –

+0

我想让超类成员以相同的方式初始化。在堆上对象的“分配”和其成员的实例化(反过来可能需要分配)是不同策略的一部分?@millimoose你所说的对于DI框架是正确的,因为正如你所说“它是大多数是来自你的代码库的对象“。但是,我尝试了一个通用的”对象生成器“,用于一个需要外部适配器类并且不想限制为需要拥有一个默认构造器的项目定义 –

回答

0

我不知道如果我理解你的问题,但通常在Java中,如果你知道类名称,你可以简单地写: classname myObject = new classname();

+1

这个问题与运行时相关 - 在编译时他不知道类型,所以不能写这个,他只有字符串,包含类名。 – msangel

0

如果你有一个是类名,你可以使用Class.newInstance(),但如果它没有默认的构造函数,你可以使用Unsafe.allocateInstance()。

您可以使用反射来查找要调用的构造函数,但您不知道要传递哪个或哪些参​​数。

相关问题