如何填写class级中的所有字段?
假设我有一个有很多不同领域的类。 这个类是DTO,出于测试目的,我不关心实际值,只是它存在。 是否有任何工具可以遍历所有字段并设置基元,0表示Number(0.0表示Float,Double,0表示整数,0L表示Long,但默认情况下不为null),类似于“测试”字符串?
此外,我希望该工具填充集合(列表,集,地图)。
只需一个小的谷歌搜索提供这样的结果:
- PODAM ( 主要网站 )
- JPopulator (Java 6)或其后续随机Bean (Java 8)
否则你可以使用reflection来填充:
- 原始/包装器,默认值
- 带有rendom值的字符串
-
具有随机大小的集合(集合,列表)并重新使用代码来填充
等等。
其他XML绑定(使用jaxb或其他技术)可以是一个选项,但需要提前准备xml数据。
除了框架之外,所有其他解决方案都有两大问题:需要编写和大量测试!
使用Introspector.getBeanInfo(object.getClass())。getPropertyDescriptors()在一个小循环中编写一个方法,根据需要填充字段。 您可以递归调用此方法来填充类,集合等。
另一种方法是使用JAXB,XStream或Abraxas进行XML反序列化。
是否有任何工具可以遍历所有字段并设置基元,0表示Number(0.0表示Float,Double,0表示整数,0L表示Long,但默认情况下不为null),类似于“test”for String? 此外,我希望该工具填充集合(列表,集,地图)。
AFAIK,没有任何东西会以简单的方式为您节省很多精力。 使用初始化程序声明字段或在构造函数中执行一些简单的默认初始化是一件小事。
使用原始类型而不是包装类型可能是个好主意; 例如int
而不是Integer
。 一个优点是具有基本类型的字段默认初始化为0.0
或false
…从而节省您的麻烦。
您可以通过reflection获取字段的类型,然后使用reflection将其初始化为您想要的任何内容。
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 "" } } }
如果使用基元,它们将自动设置为默认值。 对于Wrapper calss,如果您不关心实际值,则可以将它们保留为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 list = new ArrayList (); DTO o = new DTO (1,"Test",11.3f); list.add(o); } }
打印列表并覆盖toString()
应显示值。