JAVA反射静态内部类的属性

最近做一功能,将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 ArrayList<String> menuList = 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<Object> list = new ArrayList<>();

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、获取类的静态内部全部类名
List<String> classNameList = 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
      {
        Iterator<String> iterator = 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<Object> list = new ArrayList<>();
                    JSONArray array = (JSONArray) value;
                    for (int i = 0; i < array.length(); i++)
                      {
                        list.add(array.get(i));
                      }
                    //获取静态内部类需要使用"$"符号
                    Class<?> objClass = Class.forName(CONFIG_CLASS + "$"+ className);
                    Field field = objClass.getDeclaredField((String) key);
                    field.setAccessible(true);
                    field.set(key, list);
                    continue;
                  }
                //获取静态内部类需要使用"$"符号
                Class<?> objClass = Class.forName(CONFIG_CLASS +"$"+ className);
                Field f = objClass.getDeclaredField((String) key);
                if (f != null)
                  {
                    f.setAccessible(true); // 设置属性可以直接的进行访问
                    f.set(key, value);//设置值
                  }
              }
          }
      } catch (JSONException e)
      {
        e.printStackTrace();
      } catch (ClassNotFoundException e)
      {
        e.printStackTrace();
      } catch (NoSuchFieldException e)
      {
        e.printStackTrace();
      } catch (IllegalAccessException e)
      {
        e.printStackTrace();
      }

  }

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值