Android反射打造万能SharedPreferences

1.将我们想要保存的数据封装成一个实体类 Person.java 其中属性我们都用Public来修饰

public class Person {
    //String类型属性 姓名
    public String name;
    //int类型属性 年龄
    public int age;
    //float类型属性 身高
    public float height;
    //boolean类型属性 是否已婚
    public boolean isMarried;
    //String类型属性 证件号
    public String id;
}

2.通过反射,将Person类中的属性取出来

public class SharedPreferencesUtils {
    /**
     * 根据传入的对象,取出其中用public修饰符修饰的属性
     * @param clazz 想要拿到属性的类的字节码文件
     * @return 所有用pulic修饰的属性的一个list表
     */
    public static <T> List<Field> getPublicFields(Class<?> clazz){
        if (clazz.equals(Object.class)) {
            return null;
        }
        //用来存储clazz中用public修饰的属性的list
        List<Field> list = new ArrayList<Field>();
        //获得clazz中所有用public修饰的属性
        Field[] fields = clazz.getFields();
        //将fields加入到list中
        for(int i=0 ; i<fields.length ; i++){
            list.add(fields[i]);
        }
        return list;
    }

我们先来测试一下属性有没有被取出来,我们在MainActivity.java中添加如下代码进行测试

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //调用我们刚刚写好的方法来获取Person类中的属性
        List<Field> publicFields = SharedPreferencesUtils.getPublicFields(Person.class);
        for(Field f : publicFields){
            String name = f.getName();
            Log.i("TAG", name+"\n");
        }
    }
}

我们来看一下Log打印的信息

我们可以看到,Person中的属性我们都已经拿到了

3.将对象存储到SharedPreferences中

public static void putObjectToShare(String shareName , Object obj){
        //获得SharedPreferences实例
        SharedPreferences sharedPreferences = mContext.getSharedPreferences(shareName,Activity.MODE_PRIVATE);
        //获得Editor
        Editor edit = sharedPreferences.edit();
        //存储数据之前先将之前的旧数据清掉
        edit.clear();
        //调用commit提交数据(这里为了清掉数据)
        edit.commit();

        List<Field> publicFields = getPublicFields(obj.getClass());
        for(Field f : publicFields){
            String name = f.getName();
            try {
                //获得当前属性的类型和值
                //类型的话如果是基本类型,会自动装箱
                Object type = f.get(obj);
                //判断各种类型,调用各种类型的put方法将数据存储进去
                if (type instanceof String) {
                    edit.putString(name, (String) type);
                }else if (type instanceof Integer) {
                    edit.putInt(name, (Integer) type);
                }else if (type instanceof Float) {
                    edit.putFloat(name, (Float) type);
                }else if (type instanceof Long) {
                    edit.putLong(name, (Long) type);
                }else if (type instanceof Boolean) {
                    edit.putBoolean(name, (Boolean) type);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            //调用commit,提交数据
            edit.commit();
        }
    }

4.将对象从SharedPreferences中取出来

public static <T> T getObjectFromShare(String shareName , Class<T> clazz){
        //获得SharedPreferences实例
        SharedPreferences sharedPreferences = mContext.getSharedPreferences(shareName, Activity.MODE_PRIVATE);
        //T是一个泛型,根据clazz不同而不同
        T t = null;
        try {
            //获得sharedPreferences中所有的数据,数据为键值对保存在map中
            Map<String,?> map = sharedPreferences.getAll();
            //调用getPublicFields方法得到clazz中所有的公有属性
            List<Field> publicFields = getPublicFields(clazz);
            //如果两者都不为空的话
            if (map.size()>0 && publicFields.size()>0) {
                //将T实例化出来
                t = clazz.newInstance();
                //遍历map中所有的键值对
                for(Map.Entry<String,?> entry : map.entrySet()){
                    //map中的键
                    String key = entry.getKey();
                    //map中的值
                    Object value = entry.getValue();
                    //遍历clazz中的所有公有属性
                    for(Field field : publicFields){
                        //获得属性名
                        String name = field.getName();
                        //如果属性名与键相同
                        if (name.equalsIgnoreCase(key)) {
                            //相当于给对象T中的属性field赋值,值为value
                            field.set(t, value);
                            break;
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        //整个遍历结束后,我们的对象中的属性也都有值了
        return t;
    }

5.我们来测试一下,修改MainAcitvity.java中的代码

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //实例化一个Person实例,这是我们想要存储到SharedPreferences中的对象
        Person p = new Person("zhangsan",23,175.0f,false,"001");
        //将p存储到SharedPreferences的“zhangqi”名下
        SharedPreferencesUtils.getInstance(this).putObjectToShare("zhangqi",p);;
        //从SharedPreferences的“zhangqi”名下取出之前存储过的Person实例
        Person savedPerson = SharedPreferencesUtils.getInstance(this).getObjectFromShare("zhangqi",Person.class);
        Log.e("zhangqi",""+savedPerson.toString());
    }
}

我们看一下Log中打印的savedPerson的信息

源码下载

时间: 2024-11-06 09:26:44

Android反射打造万能SharedPreferences的相关文章

Android 快速开发系列 打造万能的ListView GridView 适配器

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38902805 ,本文出自[张鸿洋的博客] 1.概述 相信做Android开发的写得最多的就是ListView,GridView的适配器吧,记得以前开发一同事开发项目,一个项目下来基本就一直在写ListView的Adapter都快吐了~~~对于Adapter一般都继承BaseAdapter复写几个方法,getView里面使用ViewHolder模式,其实大部分的代码基本都是类似的

android打造万能的适配器

荒废了两天,今天与大家分享一个ListView的适配器 前段时间在学习慕课网的视频,觉得这种实现方式较好,便记录了下来,最近的项目中也使用了多次,节省了大量的代码,特此拿来与大家分享一下. 还是先看图片,这里我模仿博客园App的列表样式做了一个静态的数据列表    这里用到的类比较多,不过核心的只有两个,其余均为演示所用,先来看核心的两个类 ViewHolderM.java package landptf.tools; import android.content.Context; import

android打造万能的适配器(转)

荒废了两天,今天与大家分享一个ListView的适配器 前段时间在学习慕课网的视频,觉得这种实现方式较好,便记录了下来,最近的项目中也使用了多次,节省了大量的代码,特此拿来与大家分享一下. 还是先看图片,这里我模仿博客园App的列表样式做了一个静态的数据列表     这里用到的类比较多,不过核心的只有两个,其余均为演示所用,先来看核心的两个类 ViewHolderM.java package landptf.tools; import android.content.Context; impor

Path特效之PathMeasure打造万能路径动效

前面两篇文章主要讲解了 Path 的概念和基本使用,今天我们一起利用 Path 做个比较实用的小例子: 上一篇我们使用 Path 绘制了一个小桃心,我们这一篇继续围绕着这个小桃心进行展开: -------------------------------------------------- 如果你想看 GAStudio Github主页,请戳这里: 如果你想看 GAStudio更多技术文章,请戳这里: QQ技术交流群:277582728: ----------------------------

安卓开发笔记——打造万能适配器(Adapter)

为什么要打造万能适配器? 在安卓开发中,用到ListView和GridView的地方实在是太多了,系统默认给我们提供的适配器(ArrayAdapter,SimpleAdapter)经常不能满足我们的需要,因此我们时常要去继承BaseAdapter类去实现一个自定义的适配器来满足我们的场景需要. 如果你是开发一个简单点的APP还好,可能ListView和GridView的数量不会太多,我们只要去写几个BaseAdapter实现类就可以了. 但如果有一天,你需要开发一个APP里面具有几十个ListV

Android反射机制实现与原理

本文介绍Android反射机制实现与原理,在介绍之前,要和Java进行比较,所以先看下Java中的反射相关知识: 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 在Java中的反射机制,被称为Reflection(大家看到这个单词,第一个想法应该就是去开发文档中

Android 存储文件方式之一---SharedPreferences 内容提供者,以xml 的方式进行数据 存储。是一种轻量级的文件数据存储

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 //UI界面的布局 文件<br><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"

Android数据存储-通过SharedPreferences实现记住密码的操作

在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过SharedPreferences实现记住密码的操作 一.首先:介绍下什么是SharedPreferences? SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置. 二.介绍了SharedPreferences,我们将通过记住SharedPrefe

38. Android 反射资源工具ReflectionUtil

38. Android 反射资源工具ReflectionUtil Android 反射资源工具ReflectionUtil 工具代码 工具使用 工具代码 ReflectionUtil public class ReflectionUtil { public enum ResourcesType { styleable, style, string, mipmap, menu, layout, integer, id, drawable, dimen, color, bool, attr, ani