野人学Android第三弹——利用java的反射机制创建一个数据操作类
2016-01-14 23:52
633 查看
在android的教学视频中,知道“Bean”的存在,觉得挺有道理的,所以在Andorid的开发中,经常会运用到。但是在实际的开发中,数据结构Bean经常会修改,从而引发调用Bean的类的修改,引起连锁反应。最近在开发一款app的时候,涉及的Bean比较多,调整的工作量加大,秉着“好的程序猿都是懒人”的原则,研究了java的反射机制,创建了一个基于Bean的逻辑操作类,也就是说我不管你是什么Bean,都能用我的逻辑操作类进行数据形式的转换。想想还有点小激动,以后可以偷懒啦!哈哈哈~
言归正传,首先来简单介绍下我们的主角——Bean类。
Bean的存在,让对象的数据可以封装起来,符合Java的OOP思想。上面的代码中展示的是一个很简单的Gril的Bean类,在实际的开发中,会在很多地方使用到,比如说从数据表中调用gril类的数据,或者说从Server端传输Json格式的gril类数据。也就是说,只要app中的gril类数据,都会使用bean来封装。那么,问题就来了,随着需求的不断变化,GrilBean也会跟着变化,那么开发前期用到GrilBean类的程序中就会做相应的修改。如果你的app是一个比较庞大或者复杂的项目,那么需求的一丢丢修改,都会让你抓狂的。所以,自然而然地,我就想到有没有一种比较“懒”的方法能解决这个问题。
一、Bean功能的抽象
观察Bean类,主要的作用是封装了数据结构,并且使用setxxx和getxxx方法来对数据属性进行操作。也就是说Bean的最大作用是set或者get相应的属性,那么有没有可能独立于具体的bean类,直接用普遍的set和get方法来对Bean来操作呢?我想到的一个思路是,将具体的属性通过参数的形式传递给Bean类,这样一来就不受Bean的约束,可以创建一个接口,包含set()和get()两个方法接口。如下:
所有的Bean类都会继承这个接口类,那么必须要实现set()和get()方法。以GrilBean类为例,如下:
这样一来的话,在使用GrilBean类的时候,我只需要使用set(key,value)或者get(key)的形式就能对GrilBean中的属性进行统一的操作。
二、利用反射机制获取Bean类的属性名称
如果能获取GrilBean的所有属性,那么就能用循环语句进行操作。这时候就要用到java的反射机制了(如果不了解java的反射机制,那请自行百度)。如下:
通过以上的方法就能获取到任何Bean类的属性名称,想想是不是还有点小激动呢?!
三、小试牛刀,JSONArray转换成List
基于GrilBean的数据格式之间的转换,比如说JSONArray格式转换成List格式,就能用到以上的方法。如下代码添加到上面的BeanModel类:
这样一来,不管你有多少Bean类,或者后期怎么修改Bean类的属性值,我都不用再去修改其他调用Bean类的文件。当然,如果有更好的思路,也可以跟我分享,谢谢!
言归正传,首先来简单介绍下我们的主角——Bean类。
public class GirlBean{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Bean的存在,让对象的数据可以封装起来,符合Java的OOP思想。上面的代码中展示的是一个很简单的Gril的Bean类,在实际的开发中,会在很多地方使用到,比如说从数据表中调用gril类的数据,或者说从Server端传输Json格式的gril类数据。也就是说,只要app中的gril类数据,都会使用bean来封装。那么,问题就来了,随着需求的不断变化,GrilBean也会跟着变化,那么开发前期用到GrilBean类的程序中就会做相应的修改。如果你的app是一个比较庞大或者复杂的项目,那么需求的一丢丢修改,都会让你抓狂的。所以,自然而然地,我就想到有没有一种比较“懒”的方法能解决这个问题。
一、Bean功能的抽象
观察Bean类,主要的作用是封装了数据结构,并且使用setxxx和getxxx方法来对数据属性进行操作。也就是说Bean的最大作用是set或者get相应的属性,那么有没有可能独立于具体的bean类,直接用普遍的set和get方法来对Bean来操作呢?我想到的一个思路是,将具体的属性通过参数的形式传递给Bean类,这样一来就不受Bean的约束,可以创建一个接口,包含set()和get()两个方法接口。如下:
public interface Bean { public Object get(String key); public void set(String key ,Object value); }
所有的Bean类都会继承这个接口类,那么必须要实现set()和get()方法。以GrilBean类为例,如下:
public class GirlBean implements Bean{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Object get(String classKey){ Object o =null; switch (classKey) { case "name": o = this.getName(); break; case "age": o = this.getAge(); break; default: break; } return o; } public void set(String classKey, Object value){ switch (classKey) { case "name": this.setName((String)value); break; case "age": this.setAge((int)value); break; default: break; } } }
这样一来的话,在使用GrilBean类的时候,我只需要使用set(key,value)或者get(key)的形式就能对GrilBean中的属性进行统一的操作。
二、利用反射机制获取Bean类的属性名称
如果能获取GrilBean的所有属性,那么就能用循环语句进行操作。这时候就要用到java的反射机制了(如果不了解java的反射机制,那请自行百度)。如下:
public class BeanModel<T> { private Bean bean; public BeanModel(Bean bean) { super(); this.bean = bean; } public List<String> getName() { List<String> list = new ArrayList<String>(); if (this.bean != null) { Class<?> clz = this.bean.getClass(); Field[] fields = clz.getDeclaredFields();//通过反射获取类的属性,返回给一个数组 for (Field field : fields) { // System.out.println(field.getName()); list.add(field.getName());//将类的属性名称添加到List集合中 } } return list; } }
通过以上的方法就能获取到任何Bean类的属性名称,想想是不是还有点小激动呢?!
三、小试牛刀,JSONArray转换成List
基于GrilBean的数据格式之间的转换,比如说JSONArray格式转换成List格式,就能用到以上的方法。如下代码添加到上面的BeanModel类:
public List<T> change(JSONArray json){ List<String> nList = this.getName();//获取Bean类的属性名称 List<T> list = new ArrayList<T>(); for (int i = 0; i < json.size(); i++) { JSONObject jo = json.getJSONObject(i); for (String s : nList) { bean.set(s, jo.get(s));//设置bean的属性值 } list.add((T) bean); } return list; }
这样一来,不管你有多少Bean类,或者后期怎么修改Bean类的属性值,我都不用再去修改其他调用Bean类的文件。当然,如果有更好的思路,也可以跟我分享,谢谢!
相关文章推荐
- Android退出应用最优雅的方式
- Android Studio——InputStreamReader和BufferedReader用法及真实案例
- Android Studio 优化的相关博客
- 在 Android 上使用 XML
- Android Actionbar 添加返回按钮
- Android 设置背景透明度
- Android 设置背景透明度
- Android Studio——JAVA的StringBuffer类
- 【Android】深入理解Context
- Android性能优化之加快应用启动速度
- Android性能优化之加快应用启动速度
- android drawable 、drawable-ldpi、drawable-mdpi、drawable-hdpi、。。。
- android中的回调
- android中的回调
- 《Android Studio实用指南》8.20 提炼接口
- android好blog发现
- android wearable-Transferring Assets,Sending and Receiving Messages,Handling Data Layer Events
- 添加地图注记出现的问题
- android基础学习之SurfaceView
- android Wearable-Accessing the Wearable Data Layer and Syncing Data Items