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. MySql 8.0 C#连接报错 MySql.Data.MySqlClient.MySqlException (0x80004005): Authentication to host '12.118.224.181' for user 'root' using method 'caching_sha2_password' failed with message: Reading from t

    解决方法 在连接字符串后面加上   SslMode=None 

  2. Maven的基本概念

    一.Maven的基本概念' Maven(翻译为"专家","内行")是跨平台的项目管理工具.主要服务于基于Java平台的项目构建,依赖管理和项目信息管理. 1.1 ...

  3. MySQL卸载安装8.0.*

    一.卸载 1. 本人安装目录在C盘Program Files文件中(删除MySQL文件夹) 2. 找到C盘Program Data隐藏文件夹中的MySQL并删除(删除提示MySQL在运行的话可以去任务 ...

  4. foreach循环里不能remove/add元素的原理

    foreach循环 ​    foreach循环(Foreach loop)是计算机编程语言中的一种控制流程语句,通常用来循环遍历数组或集合中的元素.Java语言从JDK 1.5.0开始引入forea ...

  5. HTTP响应 状态码描述

  6. MySQL存储过程 CASE语句

    MySQL存储过程  CASE语句 除了IF语句,MySQL提供了一个替代的条件语句CASE. MySQL CASE语句使代码更加可读和高效. CASE语句有两种形式:简单的搜索CASE语句. 简单C ...

  7. obfuscate 混淆 verb

  8. Oracle中国移动经典面试题(附代码跟两种答案)

    /*中国移动sql面试题: create table test(   id number(10) primary key,   type number(10) ,   t_id number(10), ...

  9. 利用scrapy-client 发布爬虫到远程服务端

    远程服务端Scrapyd先要开启 远程服务器必须装有scapyd,并开启. 这里远程服务开启的端口和ip: 192.166.12.80:6800 客户端配置和上传 先修爬虫项目文件scrapy.cfg ...

  10. C# 枚举 Flag属性(权限设计)

    枚举是一个可以列举元素的对象,常用于权限,日期,类型等. 如果对一个值可以包含多个,那么可以使用枚举,加上Flags [Flag] public enum Permission { create=, ...