package com.overlook.weagree.util;

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.app.AppCompatActivity;
import android.util.Log; import com.overlook.weagree.entity.CurrentUser; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map; public class CurrentUserUtil { private static final String TAG = "CurrentUserUtil"; private static final String CURRENT_USER = "current-user"; private static final Map<String,Method> SETTER = new HashMap<>(); private static final Map<String,Method> GETTER = new HashMap<>(); static {
if (SETTER.isEmpty() || GETTER.isEmpty()) {
Method[] methods = CurrentUser.class.getDeclaredMethods();
for (Method method : methods) {
String methodName = method.getName().toLowerCase(Locale.ENGLISH);
if (methodName.startsWith("set")) {
SETTER.put(methodName.substring(3),method);
}else{
GETTER.put(methodName.substring(3),method);
}
}
}
} public static void exit(Activity activity){
SharedPreferences sharedPref = activity.getSharedPreferences(CURRENT_USER,Context.MODE_PRIVATE);
if ( sharedPref == null ) {
return;
}
sharedPref.edit().clear().commit();
} public static CurrentUser getCurrentUser(Activity activity,Class mClass){ SharedPreferences sharedPref = activity.getSharedPreferences(CURRENT_USER,Context.MODE_PRIVATE);
if ( sharedPref == null ) {
return null;
}
CurrentUser currentUser = new CurrentUser(); Field[] fields = CurrentUser.class.getDeclaredFields(); for (Field field : fields) {
String fieldName = field.getName().toLowerCase(Locale.ENGLISH);;
Class type = field.getType();
Object value;
if (type.isAssignableFrom(Long.class)) {
value = sharedPref.getLong(fieldName,0L);
}else if (type.isAssignableFrom(Boolean.class)){
value = sharedPref.getBoolean(fieldName,false);
}else if (type.isAssignableFrom(Integer.class)) {
value = sharedPref.getInt(fieldName,0);
}else{
value = sharedPref.getString(fieldName,null);
} Method method = SETTER.get(fieldName); try {
if ( method == null ) {
Log.d(TAG, "getCurrentUser: "+fieldName);
}else{
method.invoke(currentUser,value);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} return currentUser;
} public static Boolean putCurrentUser(Activity activity,CurrentUser currentUser){
SharedPreferences sharedPref = activity.getSharedPreferences(CURRENT_USER,Context.MODE_PRIVATE); Field[] fields = CurrentUser.class.getDeclaredFields(); SharedPreferences.Editor editor = sharedPref.edit(); for (Field field : fields) {
String fieldName = field.getName().toLowerCase(Locale.ENGLISH);
Class type = field.getType();
Method method = GETTER.get(fieldName); try {
Object value = method.invoke(currentUser); if ( value == null ) {
continue;
} if (type.isAssignableFrom(Long.class)) {
Long longVal = (Long) value;
if ( ! longVal.equals(0L)){
editor.putLong(fieldName,(Long)value);
}
}else if (type.isAssignableFrom(Boolean.class)){
editor.putBoolean(fieldName,(Boolean)value);
}else if (type.isAssignableFrom(Integer.class)) {
Integer intVal = (Integer)value;
if ( ! intVal.equals(0)){
editor.putInt(fieldName,(Integer)value);
}
}else{
editor.putString(fieldName,(String)value);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
return editor.commit();
} }

  

SharedPreference映射Java类的更多相关文章

  1. hibernate中java类的成员变量类型如何映射到SQL中的数据类型变化

    hibernate映射文件??.hbm.xml配置映射元素详解--Hibernate映射类型 在从Hibernate的java的成员类型映射到SQL中的数据类型,其内映射方式它满足,SQL可以自己调制 ...

  2. MyBatis里json型字段到Java类的映射

    一.简介 我们在用MyBatis里,很多时间有这样一个需求:bean里有个属性是非基本数据类型,在DB存储时我们想存的是json格式的字符串,从DB拿出来时想直接映射成目标类型,也即json格式的字符 ...

  3. 数据表-java类的映射

    1.一个数据表对应一个java类 2.数据表的字段对应java类的属性 3.一对多的数据表关系 一方用一个java对象表示 多方用一个java对象数组表示 4.多对多的数据表关系:采用中间表,将多对多 ...

  4. 如何用Java类配置Spring MVC(不通过web.xml和XML方式)

    DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...

  5. 一种从JSON数据创建Java类的高效办法

    <一种从JSON数据创建Java类的高效办法> 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs JSON格式的数据经常会遇到,比如调用Web服 ...

  6. 普通Java类获取spring 容器的bean的5种方法

    方法一:在初始化时保存ApplicationContext对象方法二:通过Spring提供的工具类获取ApplicationContext对象方法三:继承自抽象类ApplicationObjectSu ...

  7. 探索Windows命令行系列(7):通过命令编译C#类和Java类

    1.编译 C# 类 1.1.C# 编译工具 1.2.编译一个 C# 类 1.3.编译多个 C# 类 2.编译 Java 类 2.1.Java 编译工具 2.2.编译 Java 类 3.组合命令符 4. ...

  8. Hibernate框架学习之注解映射实体类

         前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识.然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了基本的映射 ...

  9. Matlab调用Java类

    第一步:定位Matlab中Java环境的ext目录 新建一个M script文件,或者直接在Matlab的交互式命令行中输入: >> disp(java.lang.System.getPr ...

随机推荐

  1. 算法(第四版)C# 习题题解——2.5

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 查找更方便的版本见:https ...

  2. php登录注册

    php 登录注册 注册代码:register.php <style type="text/css"> form{ width:300px; background-col ...

  3. freeswitch 事件命令

    1.uuid_bridge 桥接两条呼叫的腿. Usage: uuid_bridge <uuid> <other_uuid> uuid_bridge至少需要有一条腿是被呼通的. ...

  4. Request类源码分析

    通过APIView进入找到Request的源码 可以看见一堆属性和方法,其中request.data其实是一个方法,被包装成一个属性 继续看__getattr__和query_params方法: 代码 ...

  5. Lintcode470-Tweaked Identical Binary Tree-Easy

    470. Tweaked Identical Binary Tree Check two given binary trees are identical or not. Assuming any n ...

  6. flyway

    flyway主要基于6种基本命令:migrate, clean, info, validate, baseline, repair flyway如何运作:https://flywaydb.org/ge ...

  7. 网站性能测试工具 webbench 的安装和使用

    1.webbench的下载和安装 wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz sudo tar xvf we ...

  8. Visual Studio color schemes

    Vs环境主题配置 下载地址:https://studiostyl.es/ Son of Obsidian 下载:son-of-obsidian_vs2015.zip Litle monokai vst ...

  9. zookeeper和kafka的使用

    zookeeper使用和原理探究(一) http://www.blogjava.net/BucketLi/archive/2010/12/21/341268.html zookeeper的作用和原理讲 ...

  10. BUAAOO-Second-Summary

    #目录 homework & class & trainning : 两次上机.三次作业.四周课堂 code analysis & review : 为什么我没有bug,为什么 ...