反射将json数据注入到静态对象中

由于项目有一个需求,需要在项目启动的时候读取json数据到常量类中,而常量类中属性又是静态类,而该常量类的数据只能get,不能se,所以花费了很大的时间去进行处理,在此记录一下,防止以后会使用。

由于fastJson和jaskJson两者都是通过set方法来将数据进行注入,所以这两者才这种情况就失去了作用,而Gson能够很好的处理这种情况,所以这种场景可以运用Gson进行处理,本次没有使用Gson,使用的反射+fastJson来进行处理。

package com.herky;

import com.alibaba.fastjson.JSONObject;
import lombok.*;
import org.reflections.Reflections;

import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.Set;
/**
* 注解类,用于标注那个类是常量类,开局需要加载属性
**/
@interface He {
}
/**
* 常量类
**/
@ToString
@He
public class User {
    //常量类中具体对象,每个对象中存储了一些需要使用到的常量
    public static AA a;
    public static BB b;
    public static void main(String[] args) {
        //业务场景中json数据是读取文件进行获取, 
        String str = "{\"a\":{\"id\":1001,\"name\":\"张三\"},\"b\":{\"id\":1002,\"name\":\"李四\"}}";
        Reflections f = new Reflections("com.herky");
        Set> set = f.getTypesAnnotatedWith(He.class);
        auto(str,set);
        System.out.println(User.a);
        System.out.println(User.b);
    }

    public static void auto(String json, Set> set) {
        Iterator> iterator = set.iterator();
        while (iterator.hasNext()) {
            Class next = iterator.next();
            //获取参数
            Field[] declaredFields = next.getDeclaredFields();
            JSONObject jsonObject = JSONObject.parseObject(json);
            try {
                for (Field field : declaredFields) {
                    String str1 = JSONObject.toJSONString(JSONObject.parseObject(json).get(field.getName()));
                    Object o = field.getType().newInstance();
                    Field[] declaredFields2 = o.getClass().getDeclaredFields();
                    for (Field field1 : declaredFields2) {
                        Object o1 = JSONObject.parseObject(str1).get(field1.getName());
                        field1.setAccessible(true);
                        field1.set(o, o1);
                    }
                    field.setAccessible(true);
                    field.set(null, o);
                }
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
}

//常量中的对象类,没有set方法,get方法省略
@AllArgsConstructor
@NoArgsConstructor
@ToString
class AA {
    private int id;
    private String name;
}

@AllArgsConstructor
@NoArgsConstructor
@ToString
class BB {
    private int id;
    private String name;
}

如果在处理AA类和BB类中有对象和枚举的时候上面方法就是去了效果,这个时候可以使用gson来进行处理。

package com.herky;

import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
import lombok.*;
import org.reflections.Reflections;

import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.Set;

/**
* 注解类,用于标注那个类是常量类,开局需要加载属性
**/
@interface He {
}

@He
@ToString
@AllArgsConstructor
public class User {
    public static AA a;

    public static void main(String[] args) {
        String str = "{\"a\":{\"bb\":{\"id\":1003,\"name\":\"李四\"},\"id\":1001,\"name\":\"张三\"}}";
        Reflections f = new Reflections("com.herky");
        Set> set = f.getTypesAnnotatedWith(He.class);
        auto(str, set);
        System.out.println(User.a);
    }

    public static void auto(String json, Set> set) {
        Iterator> iterator = set.iterator();
        while (iterator.hasNext()) {
            Class next = iterator.next();
            Field[] declaredFields1 = next.getDeclaredFields();
            System.out.println();
            try {
                Gson gson = new Gson();
                JSONObject jsonObject = JSONObject.parseObject(json);
                for (Field field : declaredFields1) {
                    String str1 = jsonObject.get(field.getName()).toString();
                    /**
                    * 用json解析数据
                    **/
                    Object o = gson.fromJson(str1, field.getType()); 
                    field.setAccessible(true);
                    field.set(null, o);
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }
}

@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
class AA {
    private int id;
    private String name;
    private BB bb;
}

@AllArgsConstructor
@NoArgsConstructor
@ToString
@Getter
class BB {
    private int id;
    private String name;
}

你可能感兴趣的:(反射将json数据注入到静态对象中)