数据自动映射时模型类非关联性字段映射方法

来源:互联网 发布:电气设计软件有哪些 编辑:程序博客网 时间:2024/06/10 21:33

做android开发的朋友们有没有遇到过这样的情况,android项目与接口同时开发的时候经常开发到一个功能时接口还没开发好,我们只好造假数据进行填充,等到接口定义好了之后然后对应着数据模型字段一个一个修改。字段数量不多时修改起来容易,但是一旦字段多了,修改起来不仅麻烦而且容易弄错。对此,我提出一个我的解决办法,希望能帮助到类似这样开发的小伙伴们。
进入正题。
我们对接数据时一般都会生成一个模型类来存储数据,例如这样:

public class TestBean {private String name;private String age;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}}
使用数据时会这样写:
public class TestDataBean{public static void main(String[] args) {DataBean dataBean=new DataBean();System.out.println(dataBean.getName());}}
但是当我们还不知道接口返回给我们的数据字段的情况下,我们是不能写死name和age这些字段的,因为接收数据时做自动映射必须字段名跟接口字段名相一致,不然会导致映射失败。但是不创建这里面的字段,我们的逻辑代码就无法继续进行编写,只能等待接口数据确定完成后才能实际定义模型类数据与逻辑代码数据的对接,这样是很不好维护的一个过程,因为我们不仅要修改模型类,还需要修改数据对接的逻辑代码,所以极不可取。
所以可以这样做,建立一个BaseBean对象,以后所有的Bean对象都继承BaseBean,具体功能,直接贴代码了:

public class BaseBean{//存储所有子类的属性名private List<String> list=new ArrayList<String>();public BaseBean(){//下面的代码是利用反射循环获取自身以及自己继承的父类,父类的父类。。。的所有属性名,并存储到list中Class clazz = getSelf().getClass();do {Field[] fields = clazz.getDeclaredFields();for (int i=0;i<fields.length;i++) {//System.out.println("name:"+fields[i].getName());list.add(fields[i].getName());}clazz = clazz.getSuperclass();} while (clazz != Object.class);}/** * 获取对象自身,这里的this是继承该类的末端类,例如有Bean1继承BaseBean,Bean2继承Bean1,this则代表着Bean2。 * @return */private BaseBean getSelf(){return this;}/** * 根据list的index获取属性名,并拼接成get方法。例如有public String a="xuqing",则属性名为a,我们把它拼接成getA()方法,然后利用反射调用该方法则可获取属性的值。 * @param index * @return */public Object getObject(int index){try{//屏蔽掉父类中保存属性名的list属性if(list.get(index).equals("list")){return null;}//拼接成get方法String name="get"+getMethodName(list.get(index));Class clazz=this.getSelf().getClass();//利用反射获取该方法的对象Method m=clazz.getDeclaredMethod(name);//利用反射调用该方法,并返回属性值return m.invoke(this.getSelf());}catch(Exception e){e.printStackTrace();}return null;}//把字符串的第一个字母大写    private static String getMethodName(String fildeName) throws Exception{          byte[] items = fildeName.getBytes();          items[0] = (byte) ((char) items[0] - 'a' + 'A');          return new String(items);      } }
使用的时候只需要模型类继承BaseBean类即可。

public class TestBaseBean extends BaseBean{private String a="xuqing1";private String b="xuqing2";public String getA() {return a;}public void setA(String a) {this.a = a;}public String getB() {return b;}public void setB(String b) {this.b = b;}}
写入数据不变,获取数据的时候只需要这样即可。
public class Test{public static void main(String[] args){TestBaseBean t=new TestBaseBean();System.out.println(t.getObject(0));//获取第一个属性,打印xuqing1System.out.println(t.getObject(1));//获取第二个属性,打印xuqing2}}
这样不管TestBaseBean中的属性有或者没有,我们都可以先完成Test中的代码,在获取接口数据的时候,我们字需要对应TestBaseBean中数据的顺序即可。以后等接口对接时,我们就只需要关心我们的数据模型类的建立咯,再也不用修改逻辑代码了。
第一次写这么多文字的博客,不太会玩,有不足的地方欢迎大家指正,多谢观看。



原创粉丝点击