数据自动映射时模型类非关联性字段映射方法
来源:互联网 发布:电气设计软件有哪些 编辑:程序博客网 时间: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中数据的顺序即可。以后等接口对接时,我们就只需要关心我们的数据模型类的建立咯,再也不用修改逻辑代码了。
第一次写这么多文字的博客,不太会玩,有不足的地方欢迎大家指正,多谢观看。
阅读全文
0 0
- 数据自动映射时模型类非关联性字段映射方法
- mybatis中映射文件和实体类的关联性
- 映射实体类添加非数据库字段后@Transient不起作用
- Hibernate映射实体类自动导入方法
- hibernate 对象关联,映射非主键字段
- 关于Spring @RequestBody 自动映射模型
- 数据映射字段业务规则:FieldRuleAttribute
- 数据映射字段业务规则:FieldRuleAttribute
- [php]领域模型和数据映射器
- JPA之大数据字段映射与字段延迟加载
- 多种方法让网络共享资源自动映射
- VS2008 自动添加消息映射函数方法
- 自动生成mybatis映射文件的方法
- Spring2.5 BeanPropertyRowMapper ResultSet和实体类的字段进行实现自动映射
- Mybatis开启数据库字段自动映射为驼峰命名
- otl + mysql 查询时映射字段
- tinkphp中字段映射
- thinkphp 字段映射
- PYTHON @classmethod
- HDU
- 安卓Chronometer计时器的简单使用
- to_string在C++中无法使用?
- Inno Setup入门(十一)——完成安装后执行某些程序
- 数据自动映射时模型类非关联性字段映射方法
- 二级联动
- 每日练习2017-10-31
- gitbash下命令行操作技巧
- 栈的基本操作及实现
- 我是一个线程
- vue项目中axios跨域的问题
- 每日练习2017-11-01
- 直插电解电容-耐压值-容值-物理尺寸对应关系