运行时反射复合对象方法记录Reflect

提要:
工作中需要做Junit测试报告给客户,后端增加方法需要覆盖到,因此需要前端业务数据做分支测试以便覆盖相关功能。
业务复杂、数据类型复杂,需要大量的table数据和控制分支数据。业务对象复杂,对象属性多为其他类型对象或者对象数组,以及基本类型数据。编写号junit类后构建传入对象要疯了的感觉。大片大片的对象数组,数组套数组而且数量比较大。
思路:
首先考虑到的是序列化整个入参对象到本地,然后直接将该对象引入到junit中进行测试。比较省时省力(懒惰似乎是程序员的优秀品质),但项目中几近全部类并没有实现序列化接口,经过了半晚上的该项目代码尝试后仍未成功,果断放弃。一个原因是项目junit的示例代码是采用类中手写构建数据的方式,另一个是对项目代码改动比较大有一定的风险(时刻紧绷着“决不能动老代码的弦,能增则增,不然大厦倾覆尸骨无存)。
其次考虑到采用反射的方式将运行时用到的对象整个打印出来,然后再调整数据的格式,这样就是增加一个方法打印数据后删除即可。

	1.首先要考虑对象是是不是数组,数组则循环判断每个对象。。。。

最终并没有用上,花了将近两天时间把对象构建完成,一个测试类为了构建数据写了将近700行,醉了,求教好方法junit数据构建。!!!!!

唉。。。看代码吧,目前测试可以取到相关值,注意点就是对象的类型判断。

下面首先是处理属性方法

package test;

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.ArrayList;

public class Snippet {
	public static void main(String[] args) throws Exception { 
	 Person person = new Person(101, "John");
	 
	 Person2 person2 = new Person2(102,"tom");
	 person.setPerson2(person2);
	 Person2 [] person2s = {new Person2(12, "xm"),new Person2(11, "dgc")};
	 int [] is =   {1,2,3};
	 person2.setArr2(is);
	 Person [] personArr = {new Person(999, "this is my test")};
	 person2.setPersons(personArr);
	 person.setPerson2s(person2s);
	 getFiled(person);
	}
	//处理数组方法
	static void dealArr(Object obj) {
		ArrayList<Object> arra = new ArrayList<>();
		if(obj.getClass().getComponentType().isPrimitive()
						 || (obj.getClass().getComponentType() == String.class)) {//该数组的对象类型为基本类型、字符串类型则打印名称和整个数组
			for(int i =0;i<Array.getLength(obj);i++) {//循环获取数组中的值
				arra.add(Array.get(obj, i));
			}
			System.out.println(obj.getClass().getComponentType()+"==="+arra);
		}else {//数组内的对象不满足要求,则循环每个对象并将对象继续送给处理对象的方法继续处理,知道最后一层
			for(int j =0;j<Array.getLength(obj);j++) {
				Object object = Array.get(obj, j);
				getFiled(object);
			}
		}
		System.out.println(obj.getClass().getComponentType());
	}
	//处理非数组方法
	static void getFiled(Object obj) {
		Class clazz = obj.getClass();
		if(clazz.isArray()) {//对类型进行判断,数组则进入数组处理方法
			dealArr(obj);
		}else {//非数组则循环其所有属性,对属性进行类型判断
			 Field [] fields = clazz.getDeclaredFields();
			 for (Field field : fields) {
				 if(field.getType().isPrimitive()
						 || (field.getType() == String.class)) {//基本类型、字符串类型直接打印出来
					 System.out.println(field.getType()+"="+field.getName());
					 try {
						 System.out.println(field.get(obj).toString());
					} catch (Exception e) {
						System.out.println(e);
					}
				 }else {//非基本类型进入该分支
					 System.out.println(field.getType()+"="+field.getName());
					 if(field.getType().isArray()) {//属性为数组情况,则将该属性对象送入数组方法处理
						 try {
							 if(null == field.get(obj)) {
								 System.out.println(field.getGenericType());
							 }else {
								 dealArr(field.get(obj));
							 }
						} catch (IllegalArgumentException | IllegalAccessException e) {
							e.printStackTrace();
						}
					 }else {//属性为对象,则进入对象处理方法。继续分解其属性
						 try {
							 if(null == field.get(obj)) {
								 System.out.println(field.getGenericType());
							 }else {
								getFiled(field.get(obj));
							 }
							} catch (IllegalArgumentException | IllegalAccessException e) {
								System.out.println(e);
							}	
					}
				 }
				 
			}
		}
	}
}

然后是测试中用到测试类1。

package test;

import java.io.Serializable;

public class Person implements Serializable{
	int num;
	String color;
	Person2 [] person2s;
	public Person2[] getPerson2s() {
		return person2s;
	}
	public void setPerson2s(Person2[] person2s) {
		this.person2s = person2s;
	}
	public Person(int num,String color){
	this.num = num;
	this.color = color;
	}
	public Person2 getPerson2() {
		return person2;
	}
	public void setPerson2(Person2 person2) {
		this.person2 = person2;
	}
	Person2 person2 ;
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
}

然后是测试类2

package test;

import java.io.Serializable;

public class Person2 {
	int arr2 [];
	int person2Num;
	Person [] persons;
	public Person[] getPersons() {
		return persons;
	}
	public void setPersons(Person[] persons) {
		this.persons = persons;
	}
	String person2Color;
	public Person2(int i, String string) {
		this.person2Num = i;
		this.person2Color = string;
	}
	public int getPerson2Num() {
		return person2Num;
	}
	public int[] getArr2() {
		return arr2;
	}
	public void setArr2(int[] arr2) {
		this.arr2 = arr2;
	}
	public void setPerson2Num(int person2Num) {
		this.person2Num = person2Num;
	}
	public String getPerson2Color() {
		return person2Color;
	}
	public void setPerson2Color(String person2Color) {
		this.person2Color = person2Color;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值