假设我有一个有很多不同领域的课程。这个类是一个 DTO,出于测试目的,我不关心实际值,它只是存在。是否有任何工具可以遍历所有字段并设置原语,数字为 0(浮点数为 0.0,双精度数为 0,整数为 0,长整数为 0L,但默认不为空),类似于字符串的“测试”?
另外,我希望该工具能够填充集合(列表、集合、地图)。
假设我有一个有很多不同领域的课程。这个类是一个 DTO,出于测试目的,我不关心实际值,它只是存在。是否有任何工具可以遍历所有字段并设置原语,数字为 0(浮点数为 0.0,双精度数为 0,整数为 0,长整数为 0L,但默认不为空),类似于字符串的“测试”?
另外,我希望该工具能够填充集合(列表、集合、地图)。
只是一个小的谷歌搜索提供了这个结果:
否则你可以使用反射来填充:
Collection<T>(set,list)
具有随机大小和重复使用代码来填充<T>
等等。
其他 XML 绑定(使用 jaxb 或其他技术)可以是一种选择,但需要提前准备好带有数据的 xml。
除了框架,所有其他解决方案都有两个大问题:需要编写和大量测试!
如果您使用原语,它们将自动设置为其默认值。在 Wrapper 类的情况下,如果您不关心实际值,则可以将它们保留为 null。如果在未初始化它们的情况下访问它们,则可以抛出 NullPointerException。
为了在列表中填充它,最简单的方法应该是创建一个类对象并将对象添加到列表中。
class DTO
{
int a;
String b;
float c;
DTO (int a,String b,float c)
{
this.a=a;
this.b=b;
this.c=c;
}
public static void main (String args[])
{
List <DTO> list = new ArrayList<DTO>();
DTO o = new DTO (1,"Test",11.3f);
list.add(o);
}
}
打印列表并覆盖toString()
应该显示值。
您可以通过反射获取字段的类型,然后将其初始化为您想要的任何内容,也可以使用反射。
public static void main(String[] args) {
MyDTO myDTO = new MyDTO();
Field [] fields = myDTO.getClass().getDeclaredFields();
for (Field field: fields){
if (field.getType().equals(Integer.TYPE)){
//Primitives are already initialized to 0, so no need to do anything.
}else if (field.getType().equals(String.class)){
System.out.println("String");
//Invoke setter method with reflection, initialize to ""
}
}
}
在一个小循环中使用 Introspector.getBeanInfo(object.getClass()).getPropertyDescriptors() 编写一个方法,以根据需要填充字段。您可以递归调用此方法来填充类、集合等。
其他方式是使用 JAXB、XStream 或 Abraxas 的 XML 反序列化。
是否有任何工具可以遍历所有字段并设置原语,数字为 0(浮点数为 0.0,双精度数为 0,整数为 0,长整数为 0L,但默认不为空),类似于字符串的“测试”?我还希望该工具能够填充集合(列表、集合、地图)。
AFAIK,没有什么可以让你用简单的方法来做这件事。使用初始化程序声明字段或在构造函数中进行一些简单的默认初始化是一件小事。
使用原始类型而不是包装类型可能是个好主意;例如int
,宁可Integer
。一个优点是具有原始类型的字段默认初始化为0
,0.0
或false
... 为您省去麻烦。