public void saveData(T data) {
Class clz = data.getClass(); // 获取Class对象
Field[] fields = clz.getDeclaredFields(); // 获取该类中声明的属性
for (Field field : fields) {
field.setAccessible(true);
String type = field.getType().toString(); // 获取属性的属性名
try {
if (type.endsWith("int") || type.endsWith("Integer")) {
preferences.edit().putInt(field.getName(), field.getInt(data)).apply();
} else if (type.endsWith("long") || type.endsWith("Long")) {
preferences.edit().putLong(field.getName(), field.getLong(data)).apply();
} else if (type.endsWith("boolean") || type.endsWith("Boolean")) {
preferences.edit().putBoolean(field.getName(), field.getBoolean(data)).apply();
} else {
preferences.edit().putString(field.getName(), field.get(data).toString()).apply();
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
public T getData() {
T data = null;
try {
data = clz.newInstance();
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
String type = field.getType().toString();
if (type.endsWith("int") || type.endsWith("Integer")) {
field.set(data, preferences.getInt(field.getName(), 0));
} else if (type.endsWith("long") || type.endsWith("Long")) {
field.set(data, preferences.getLong(field.getName(), 0));
} else if (type.endsWith("boolean") || type.endsWith("Boolean")) {
field.set(data, preferences.getBoolean(field.getName(), false));
} else {
field.set(data, preferences.getString(field.getName(), ""));
}
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return data;
}
public class SharedPreferencesClassHelper {
private static HashMap<String, SharedPreferencesHolder> preferencesHolders = new HashMap<>();
private static Context appContext;
private static SharedPreferencesClassHelper instance = new SharedPreferencesClassHelper();
public static void init(Context context) {
appContext = context;
}
public static SharedPreferencesClassHelper getInstance() {
return instance;
}
public <T> T getData(Class<T> clz) {
SharedPreferencesHolder<T> holder = getPreferencesHolder(clz);
return holder.getData();
}
public <T> void saveData(T data) {
SharedPreferencesHolder<T> holder = getPreferencesHolder((Class<T>) data.getClass());
holder.saveData(data);
}
private <T> SharedPreferencesHolder<T> getPreferencesHolder(Class<T> clz) {
SharedPreferencesHolder<T> holder = preferencesHolders.get(clz.getName());
if (holder == null) {
holder = new SharedPreferencesHolder<>(appContext, clz);
preferencesHolders.put(clz.getName(), holder);
}
return holder;
}
}
SharedPreferencesClassHelper.init(context);
SharedPreferencesClassHelper.getInstance().saveData(user);
User user = SharedPreferencesClassHelper.getInstance().getData(User.class);
gson.toJson(data);
gson.fromJson(json, clz);
/**
* SharedPreferences工具类, 可以通过传入实体对象保存其至SharedPreferences中,
* 并通过实体的类型Class将保存的对象取出. 支持不带泛型的对象以及List集合
*/
public class PreferencesHelper {
private static final String LIST_TAG = ".LIST";
private static SharedPreferences sharedPreferences;
private static Gson gson;
/**
* 使用之前初始化, 可在Application中调用
* @param context 请传入ApplicationContext避免内存泄漏
*/
public static void init(Context context) {
sharedPreferences = context.getSharedPreferences(context.getPackageName(),
Context.MODE_PRIVATE);
gson = new Gson();
}
private static void checkInit() {
if (sharedPreferences == null || gson == null) {
throw new IllegalStateException("Please call init(context) first.");
}
}
/**
* 保存对象数据至SharedPreferences, key默认为类名, 如
* <pre>
* PreferencesHelper.saveData(saveUser);
* </pre>
* @param data 不带泛型的任意数据类型实例
*/
public static <T> void saveData(T data) {
saveData(data.getClass().getName(), data);
}
/**
* 根据key保存对象数据至SharedPreferences, 如
* <pre>
* PreferencesHelper.saveData(key, saveUser);
* </pre>
* @param data 不带泛型的任意数据类型实例
*/
public static <T> void saveData(String key, T data) {
checkInit();
if (data == null)
throw new IllegalStateException("data should not be null.");
sharedPreferences.edit().putString(key, gson.toJson(data)).apply();
}
/**
* 保存List集合数据至SharedPreferences, 请确保List至少含有一个元素, 如
* <pre>
* PreferencesHelper.saveData(users);
* </pre>
* @param data List类型实例
*/
public static <T> void saveData(List<T> data) {
checkInit();
if (data == null || data.size() <= 0)
throw new IllegalStateException(
"List should not be null or at least contains one element.");
Class returnType = data.get(0).getClass();
sharedPreferences.edit().putString(returnType.getName() + LIST_TAG,
gson.toJson(data)).apply();
}
/**
* 将数据从SharedPreferences中取出, key默认为类名, 如
* <pre>
* User user = PreferencesHelper.getData(key, User.class)
* </pre>
*/
public static <T> T getData(Class<T> clz) {
return getData(clz.getName(), clz);
}
/**
* 根据key将数据从SharedPreferences中取出, 如
* <pre>
* User user = PreferencesHelper.getData(User.class)
* </pre>
*/
public static <T> T getData(String key, Class<T> clz) {
checkInit();
String json = sharedPreferences.getString(key, "");
return gson.fromJson(json, clz);
}
/**
* 将数据从SharedPreferences中取出, 如
* <pre>List<User> users = PreferencesHelper.getData(List.class, User.class)</pre>
*/
public static <T> List<T> getData(Class<List> clz, Class<T> gClz) {
checkInit();
String json = sharedPreferences.getString(gClz.getName() + LIST_TAG, "");
return gson.fromJson(json, ParameterizedTypeImpl.get(clz, gClz));
}
/**
* 简易字符串保存, 仅支持字符串
*/
public static void saveData(String key, String data) {
sharedPreferences.edit().putString(key, data).apply();
}
/**
* 简易字符串获取, 仅支持字符串
*/
public static String getData(String key) {
return sharedPreferences.getString(key, "");
}
/**
* 删除保存的对象
*/
public static void remove(String key) {
sharedPreferences.edit().remove(key).apply();
}
/**
* 删除保存的对象
*/
public static void remove(Class clz) {
remove(clz.getName());
}
/**
* 删除保存的数组
*/
public static void removeList(Class clz) {
sharedPreferences.edit().remove(clz.getName() + LIST_TAG).apply();
}
}
PreferencesHelper.init(getApplicationContext); // 此处一定要使用ApplicationContext
PreferencesHelper.saveData(user);
User user = PreferencesHelper.getData(User.class);