优雅写法:自定义注解 + 反射 完成填充数据

优雅写法:自定义注解 + 反射 完成填充数据,第1张

背景

想要将如下数据存储到实体类中,然后再存储到数据库中

常规写法
for (int i = 0; i < array.length(); i++) {
	JSONObject temp = array.getJSONObject(i);
	String id = temp.getString("id");
	String sysCode = temp.getString("sysCode");
	String time = temp.getString("time");
	Integer type = temp.getInt("type");
	String moduleNames = temp.getString("moduleNames");
	Integer score = temp.getInt("score");
	String desc = temp.getString("desc");
	RepositoryInfo month = new RepositoryInfo(id, sysCode, time, type, moduleNames, score, desc);
	// TODO 调用保存方法
}
优雅写法

思路:

自定义一个注解(里面包含 json串中的key值 和 value值的类型)
接着实体类的setXXX方法上使用该注解
然后使用无参构造实例化对象,接着使用setXXX方法将 json串的 value值赋值到该对象中
最后调用保存方法将其保存到数据库中

1、自定义注解

@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {
    // 映射的字段名
    String name();
}

2、实体类中添加该注解到set字段上

// 这里仅列出关键的内容,其他就是普通的实体类的属性
	@Anno(name = "id")
    public void setId(String id) {
        this.id = id;
    }

    @Anno(name = "sysCode")
    public void setSysCode(String sysCode) {
        this.sysCode = sysCode;
    }

    @Anno(name = "time")
    public void setTime(String time) {
        this.time = time;
    }

    @Anno(name = "type")
    public void setTypes(Integer types) {
        this.types = types;
    }

    @Anno(name = "moduleNames")
    public void setModuleName(String moduleNames) {
        this.moduleNames = moduleNames;
    }

    @Anno(name = "score")
    public void setScore(Integer score) {
        this.score = score;
    }

    @Anno(name = "desc")
    public void setDesc(String desc) {
        this.desc = desc;
    }

3、使用反射处理

		// 类名
        String className = "RepositoryInfo";
        // 获取class对象
        Class<?> clazz = Class.forName(className);
        // 获取该对象的所有公共的方法
        Method[] methods = clazz.getMethods();
        for (int i = 0; i < array.length(); i++) {
            JSONObject temp = array.getJSONObject(i);
            // 使用无参构造实例化对象
            Object instance = clazz.newInstance();
            for (Method method : methods) {
                // 如果该公共的方法有 Anno 这个注解
                if (method.isAnnotationPresent(Anno.class)) {
                    // 获取到该注解
                    DataRankSetAnno column = method.getAnnotation(Anno.class);
                    // 获取该方法的参数类型
                    String paramType = method.getParameterTypes()[0].getName();
                    System.out.println(column.name() + "   " + temp.get(column.name()));
                    // 调用有该注解的方法 setXXX(XXX)
                    if ("java.lang.String".equals(paramType)) {
                        method.invoke(instance, temp.getString(column.name()));
                    } else if ("java.lang.Integer".equals(paramType)) {
                        method.invoke(instance, temp.getInt(column.name()));
                    }
                }
            }
            System.out.println(instance);
            // TODO 调用保存方法
        }

以上就是 将初级开发人员的代码 简单升级了一下
因为很多开源的框架基本都使用了自定义注解 + 反射的内容,有兴趣的可以学习一下
当然 若你闲麻烦,或者觉得几行代码的逻辑就能搞完的事,那我也emmmm…

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/563678.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-02
下一篇 2022-04-02

发表评论

登录后才能评论

评论列表(0条)

保存