我想写一个java程序,可以创建各种对象的实例。但我不知道这些对象,所以它们需要动态创建。这可以很好地与反射,但我有问题:
我写了一个实用程序类,其中包含一个Map<Class, Object>
。此映射包含所有基本类型,例如
dummyValueMap.put(int.class, Integer.MIN_VALUE);
所以我可以为int查询一个虚拟对象,在编译时我不知道的对象的构造函数中使用这个值来创建一个实例。现在我的问题是,我需要虚拟值的基本类型,可以被所有的构造器使用,所以Integer.MIN_VALUE
或MAX_VALUE
不是一个好主意。有没有人知道更好的类型值或者有一个特殊的框架?
如果构造函数参数是一个接口,我该怎么办?如何动态地获得这个接口的实现?
就原语而言,您可以实例化相应的对象并将其传递给构造函数,并通过自动装箱/拆箱的魔法将其工作(就像将Integer的实例传递给接受int参数的构造函数一样)。
对于通过反射实例化接口实现,这本身是不可能的,但您可以使用像Mockito这样的框架:
MyInterface myInterfaceImplementation = Mockito.mock(MyInterface.class);
这些都是你必须自己处理的事情:基本类型,接口类型,抽象类型…对于任何给定的构造函数参数,必须能够创建并提供一个可赋值给参数类型的值。我不知道有什么图书馆能帮上忙,但我想帮忙,因为我发现自己偶尔也会做这种事。非具体类型是比较困难的,因为Java没有(简单的)方法来查找类型的子类型。在某种程度上,您可以创建某种"抽象类型到具体类型"的映射,您可以在其中注册List
=> ArrayList
和Set
=> HashSet
。然后,您的代码可以查询要创建的类型。处理接口的其他选项是使用JDK动态代理或mock框架(如Mockito)动态创建实现对象,以及处理抽象类,如Javassist、cglib或Mockito。