java 对象递归_java递归对象子集最大宽度

使用场景:

这个场景是在Excel一对多,多对多模板导出场景下遇到的,常见的场景有财务报表,绩效报表等,存在嵌套循环的情况下,我们就需要获取对象的最大深度,以此实现循环插入,下面的行往下移动数据的最大宽度,直接贴代码

1.新建DO对象

2.标记为自定义java对象

我这里使用了ExcelDTO注解做标记,也可自定义实现接口的方式做标记

3.获取集合最大深度

4.测试

public class PerformanceService {

/**

* 标记是否是导出对象

*/

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.TYPE)

public @interface ExcelDTO {

}

@ExcelDTO

public static class User implements Serializable {

public User() {

}

public User(Integer age, String username) {

this.age = age;

this.username = username;

}

public User(List userList, Integer age, String username) {

this.userList = userList;

this.age = age;

this.username = username;

}

public User(User user, List userList, Integer age, String username) {

this.user = user;

this.userList = userList;

this.age = age;

this.username = username;

}

private User user;

public User getUser() {

return user;

}

public void setUser(User user) {

this.user = user;

}

private List userList = Lists.newArrayList();

public List getUserList() {

return userList;

}

public void setUserList(List userList) {

this.userList = userList;

}

private Integer age;

private String username;

public Integer getAge() {

return age;

}

public void setAge(Integer age) {

this.age = age;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

}

private static Integer getObjectMaxSize(Collection> datas) throws Exception {

Integer maxSize = 0;

for (Iterator iterator = datas.iterator(); iterator.hasNext(); ) {

Object object = iterator.next();

maxSize += getMaxSize(object.getClass().getDeclaredFields(), object,new AtomicInteger(0));

}

return maxSize;

}

private static boolean isJavaClass(Class> clz) {

Annotation[] annotations = clz.getAnnotations();

for (Annotation annotation : annotations) {

if (annotation.annotationType().getSimpleName().equals("ExcelDTO")) return true;

}

return false;

}

private static String getMethodName(String fildeName) throws Exception {

byte[] items = fildeName.getBytes();

items[0] = (byte) ((char) items[0] - 'a' + 'A');

return new String(items);

}

private static Integer getMaxSize(Field[] declaredFields, Object obj, AtomicInteger loopNum) throws Exception {

Integer tempNum = 1;

int current=loopNum.get();

if(!loopNum.compareAndSet(current,current+1)||current>10){

throw new RuntimeException("对象子集引用超过深度");

}

for (Field field : declaredFields) {

if (!field.isAccessible()) field.setAccessible(true);

if (field.getType() == List.class && isJavaClass((Class>) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0])) {//list类型

List listObject;

Method getListMethod = obj.getClass().getDeclaredMethod("get" + getMethodName(field.getName()));

listObject = (List) getListMethod.invoke(obj);

if (null == listObject || listObject.isEmpty()) {

continue;

}

Integer size = listObject.size();

tempNum = size;

for (int i = 0; i < size; i++) {

Object listDeclaredObj = listObject.get(i);

if (null == listDeclaredObj) {

continue;

}

tempNum -= 1;

tempNum += getMaxSize(listDeclaredObj.getClass().getDeclaredFields(), listDeclaredObj,loopNum);

}

} else if (isJavaClass(field.getType())) {//普通java类型

Object javaObj;

Method getListMethod = obj.getClass().getMethod("get" + getMethodName(field.getName()));

javaObj = getListMethod.invoke(obj);

if (null == javaObj) {

continue;

}

tempNum-=1;

tempNum += getMaxSize(field.getType().getDeclaredFields(), javaObj,loopNum);

continue;

}

}

return tempNum;

}

}

public static void main(String[] args) throws Exception {

ArrayList obj = Lists.newArrayList();

User one = new User(1, "礼拜");

User two=new User(2,"ABC");

User three=new User(2,"dgf");

User fourths=new User(2,"hec");

User fourths2=new User(2,"hec");

User fourths3=new User(2,"hec");

User fourths4=new User(2,"hec");

// one.getUserList().add(two);

// one.getUserList().add(two);

one.setUser(three);

three.getUserList().add(fourths);

three.getUserList().add(fourths2);

three.getUserList().add(fourths3);

three.getUserList().add(fourths4);

obj.add(one);

System.out.println(getObjectMaxSize(obj));

// System.out.println(new AtomicInteger(1).compareAndSet(1, 2));

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值