最近做一功能,将JSONOBJECT的属性全部反射到某一类的属性中。
我这个类很特别:Config类中存在好多静态内部类,静态内部类中全部是静态属性,如何将jsonobject值反射到属性上来?
1、Config类
public class Config { public static class Main { public static boolean isShowDeleteButton = false; public static boolean isShowCreateButton = false; public static boolean isShowStatisticsButton = false; public static final ArrayListmenuList = new ArrayList<>(); } }
2、JsonObject内容
{
"version": "1001",
"_comment": "_comment开头的key-value项全部是注释,该文件保存必须UTF-8格式",
"_comment_Main": "主界面",
"Main": {
"_comment_isShowDeleteButton": "false不显示,true显示,默认false",
"isShowDeleteButton": false,
"_comment_isShowStatisticsButton": "false不显示,true显示,默认false",
"isShowStatisticsButton": false,
"_comment_isShowToolButton": "false不显示,true显示,默认false",
"isShowToolButton": false,
"_comment_menus": "menus,可根据需求配置显示项",
"menus": ["title1", "title2", "title3"]
}
}
问题:1、如何把JSONOBJECT中的全部属性值对应到类的属性上来:通过反射机制
2、如何找到静态内部类的名称: 获取静态内部类需要使用"$"符号,如下:
Class> objClass = Class.forName(Package + configClass + ”$“+ className);
3、如何给menuList通过反射方式添加属性?
先获取jsonArray的属性值,放在list集合中,再赋值给field字段
List
JSONArray array = (JSONArray) value;
for (int i = 0; i < array.length(); i++) { list.add(array.get(i)); }
Class> objClass = Class.forName(Package + configClass + ”$“+ className);
Field field = objClass.getDeclaredField((String) key);
field.setAccessible(true);
field.set(key, list);
具体如下:
1、根据KEY找Config类中的属性字段。通过遍历jsonobject的KEY,过滤掉注释部分
(1)先通过类反射,找到Config的全部类,根据类名找对应的属性,若是普通的字段如boolean,String这样的直接赋值
a、获取类的静态内部全部类名 ListclassNameList = new ArrayList<>(); Class clazz = Class.forName(configClassNAME); Class>[] classList = clazz.getDeclaredClasses(); for (Class> classObj : classList) { if (classObj == null) { continue; } String className = classObj.getSimpleName(); classNameList .add(className); }
b、根据类名获取全部属性
private boolean isContainsKey(String key, Object className) { Class clazz = Class.forName(configClassNAME); Class>[] classList = clazz.getDeclaredClasses(); for (Class> classObj : classList) { if (classObj == null) { continue; } if (!classObj.getSimpleName().equals(className)) { continue; } //获取当前类的全部字段 Field[] fields = classObj.getDeclaredFields(); for (Field field : fields) { if (field.getName().equals(key)) { return true; } } } }
(2)遍历KEY,先判断KEY是否是class名,若是类名,需要再从递归遍历,再从class静态内部类中找属性是否相同,若相同,获取。
private void reflectionKeyValue(JSONObject jsonObject, Object className) { try { Iteratoriterator = jsonObject.keys(); while (iterator.hasNext()) { Object key = iterator.next(); if (key.toString().contains("_comment")) { continue; } if (classNameList != null && classNameList.contains(key)) {//递归遍历 JSONObject object = jsonObject.getJSONObject((String) key); reflectionKeyValue(object, key); continue; } if (isContainsKey(key, className)) { Object value = jsonObject.get((String) key); Log.i("key", key + " , value : " + value); if (value instanceof JSONArray) { if (value == null || value.equals("")) { continue; } List