java 通过自定义注解@interface 实现自动覆写方法

1、本例已获取字典名称为例。一般在开发过程中,在保存字典数据时,都是保存字典的值数据,而不保存字典的名称,这样在获取编辑页面时可以满足要求,但是在获取查看详情页面时,需要展示字典的名称,此时就需要后台再去根据字典值去获取字典的名称。但是如果一个页面上有二三十个字典值时,后台一个一个去获取字典名称是比较麻烦的。本例已自定义注解的方式,通过注解的参数配置,从而实现一劳永逸的获取字典名称的方法。

2、自定义注解类

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

@Target( { FIELD })
@Retention(RUNTIME)
public @interface Code2MC {

    // 字典的编码
    String dictCode() default "";

    // 字典值的属性名称
    String dictValueFieldMc() default "";
    
    // 字典属性值为空时的返回值
    String emptyText() default "";
}

以上为一个自定义的注解,具体的配置可以参考:

https://blog.csdn.net/yjclsx/article/details/52101922

3、定义实体对象,配置字典关系

import com.alibaba.fastjson.JSON;
import com.hx.platform.base.model.BaseModel;
import org.apache.commons.collections.BagUtils;
import org.apache.commons.lang.StringUtils;

import javax.validation.constraints.Size;
import java.lang.reflect.Field;


public class EduBuild111 extends BaseModel{
	 /**
	 *  操作的字典值
	 */
	private String operateValue;

	/**
	 * 操作的字典中文描述
	 */
	@Code2MC(dictCode = "Operate", dictValueFieldMc = "operateValue")
	private String operateTxt;

	public String getOperateValue() {
		return operateValue;
	}

	public void setOperateValue(String operateValue) {
		this.operateValue = operateValue;
	}

	public String getOperateTxt() {
		return operateTxt;
	}

	public void setOperateTxt(String operateTxt) {
		this.operateTxt = operateTxt;
	}

	public static void main(String[] args) {
		EduBuild111 build111 = new EduBuild111();
		build111.setOperateValue("哈哈");
		System.out.println("之前数据:"+ JSON.toJSONString(build111));
		build111 = CodeUtil.code2MC(build111);
		System.out.println("之后数据:"+ JSON.toJSONString(build111));
	}
}

以上的operateTxt中我们使用自定义的Code2MC注解,指定字典的编码为Operate,指定属性operateValue的值为字典值,本属性operateTxt为字典的名称。

4、反射获取字典的工具类开发

import org.apache.commons.lang.StringUtils;

import java.lang.reflect.Field;
import java.util.List;

public class CodeUtil {

    // 自动获取字典值(单个对象处理)
    public static  T code2MC(T t)  {
        if (t == null) {
            return t;
        }
        try {
            // 获取反射的类
            Class objclass = t.getClass();
            // 获取反射类的属性数组
            Field[] at = objclass.getDeclaredFields();
            for (Field fd : at) {
                // 遍历属性,校验属性是否包含自定义的Code2MC的注解
                if (fd.isAnnotationPresent(Code2MC.class)) {
                    // 包含注解,获取注解的实体
                    Code2MC d = fd.getAnnotation(Code2MC.class);
                    fd.setAccessible(true);  // 属性需要操作必须加这个
                    // 获取注解参数中指定的dictValueFieldMc属性
                    Field codeField = objclass.getDeclaredField(d.dictValueFieldMc());
                    // code保存这个属性的值
                    String code = "";
                    if (codeField != null) {
                        codeField.setAccessible(true);
                        // 通过get方法获取这个属性的值
                        Object temp = codeField.get(t);
                        if (temp != null) {
                            code = temp.toString();
                        }
                    }
                    // 空值处理
                    if (StringUtils.isNotBlank(d.emptyText())
                            && StringUtils.isBlank(code)) {
                        // 获取属性值为空时赋值为emptyText的值,该值默认为""
                        fd.set(t, d.emptyText());
                        continue;
                    }
                    // 通过定义的字典编码 和对应的字典值 获取字典名称,该方法自己根据业务去写,这里默认给值(d.dictCode()为字典的编码,code为字典的值)
                    String mc = "1111111";
                    // 调将获取到的字典名称通过set方法赋值给当前的属性
                    if (mc != null) {
                        fd.set(t, mc);
                    } else {
                        fd.set(t, StringUtils.EMPTY);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t;
    }

    // 自动获取字典值(列表处理)
    public static  List code2MC(List list) {
        for (T t : list) {
            code2MC(t);
        }
        return list;
    }
}

5、测试的方法如以上3中的main方法,测试结果如下:

java 通过自定义注解@interface 实现自动覆写方法_第1张图片

6、关键是我们自己覆写的工具类方法,自定义的注解和实体更多的是负责规则的制定,以上仅为自己的见解!不喜勿喷!学海无涯苦作舟!

 

你可能感兴趣的:(Java初探,java)