zoukankan      html  css  js  c++  java
  • 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+"
    ");
            }
        }
    }
    我们来看一下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的信息
  • 相关阅读:
    DevOps
    DevOps
    DevOps 教程
    Java 文件
    Java 包装类
    Java HashMap
    Java 包装类
    Java 文件
    Java ArrayList
    Java 日期与时间
  • 原文地址:https://www.cnblogs.com/wei1228565493/p/4654521.html
Copyright © 2011-2022 走看看