在java中动态访问和确定元素及其对象类型(不是数组/列表)



我的常见主域模型是扁平化,并且没有一种类型的对象的列表/数组。

在处理过程中,我需要放置某种提取逻辑 - 在主模型中的某个临时对象/模型中将所有相同类型的元素组合在一个列表/数组中。 我不想使用 getter 方法调用和检查实例手动检查每个元素类型,因为主模型正在增长,因此每当添加现有类型的新元素时,都需要在新添加节点的提取逻辑中更新代码。

例- 主要型号 -

Class MainModel{
Customer buyer;
Customer coBuyer;
Money price;
....
}

//Extraction logic in some code which have a populated MainModel object from some service call 
// create a list of <Customer>  Type 
List<Customer> custList = new ArrayList<Customer>();
// populate it without calling getBuyer() and checking its type,

知道吗?

您可以创建一个接口并将它们放在同一个列表中而不会出现类型问题,并在接口中放置方法 getBuyer((

public Class MainModel implements HasBuyer{
Customer buyer;
Customer coBuyer;
Money price;
....
}
public class Customer implements HasBuyer{ ... }
public interface HasBuyer{
public Customer hasBuyer();
}

之后,您可以执行以下操作:

List<HasBuyer> custList = new ArrayList<HasBuyer>();

听起来你需要一些反射代码。 有些库也可以帮助解决此类问题,但是一种简单的方法可以完成您所追求的事情,如下所示。

public class ReflectiveGrabber {
public static <T> List<T> grabMembers(Class<T> clas, Object object) {
List<T> list = new ArrayList<>();
try {
for (Field field : object.getClass().getDeclaredFields()) {
if (clas.equals(field.getType())) {
field.setAccessible(true);
T value = (T) field.get(object);
if (value != null) {
list.add(value);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
public static void main(String... none) throws Exception {
System.out.println(grabMembers(String.class, new MainModel("foo", "bah", 10)));
System.out.println(grabMembers(Integer.class, new MainModel("foo", "bah", 10)));
}
}
class MainModel {
MainModel(String buyer, String coBuyer, Integer money) {
this.buyer = buyer;
this.coBuyer = coBuyer;
this.money = money;
}
String buyer;
String coBuyer;
Integer money;
}

最新更新