使用反射创建任何类型的对象

时间:2011-10-18 19:18:05

标签: java reflection

我正在尝试编写一个可以创建各种对象实例的java程序。但我不知道这些对象,因此需要动态创建它们。这适用于反射,但我遇到问题:

我写了一个包含Map<Class, Object>的实用工具类。该地图包含所有原始类型,例如

dummyValueMap.put(int.class, Integer.MIN_VALUE);

因此,我可以查询int的虚拟对象,以便在编译时我不知道的对象的构造函数中使用此值来创建实例。现在我的问题是我需要所有构造函数都可以使用的基本类型的虚拟值,因此Integer.MIN_VALUEMAX_VALUE不是一个好主意。有没有人知道类型的更好的价值还是有特殊的框架?

如果构造函数参数是接口,我该怎么办?如何动态获得此接口的实现?

2 个答案:

答案 0 :(得分:1)

就原语而言,你可以实例化相应的对象并将其传递给构造函数,并通过自动装箱/取消装箱的魔力,它将起作用(比如将一个Integer实例传递给接受int参数的构造函数)。 / p>

通过反射来实现接口实现,这本身是不可能的,但你可以使用像Mockito这样的框架:

MyInterface myInterfaceImplementation = Mockito.mock(MyInterface.class);

答案 1 :(得分:0)

这些是你必须自己处理的事情:原始类型,接口类型,抽象类型......对于任何给定的构造函数参数,你必须能够创建并提供可赋值给参数类型的值。我不知道有任何图书馆可以帮助解决这个问题,但我想知道,因为我发现自己偶尔会做这种事情。非具体类型是很难的,因为Java没有(简单)方法来查找类型的子类型。在某种程度上,您可以创建某种“抽象类型到具体类型”地图,在这里您可以注册List =&gt;之类的内容。 ArrayListSet =&gt; HashSet。然后您的代码可以查询要创建的类型。处理接口的其他选项可以是动态creating an implementing object using JDK dynamic proxies或模拟框架,如Mockito,以及处理抽象类,Javassistcglib或Mockito。