自定义注解-比如时间转换

2023/05/26 JAVA

比如我们有一个这样的需求,在返回数据中有个Bean中的字段是Date类型,想把他转成一个 yyyy-MM-dd 格式的字符串,并放到另一个字段中,怎么做呢?

对吧,为了其他地方的方便调用,咱们可以把他封装起来,写成公共方法亦可,但更好的方案是写成一个注解,使用起来就更方便了。那我们来开始吧。

首先,创建一个自定义注解,例如@DateFormat(format = "yyyy-MM-dd"),用于标记需要转换的字段,并且支持传递新字段的名称。

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface DateFormat {
    String format();
    String targetField() default "";
}

接下来,添加一个方法来处理注解和转换日期:

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class DateConverter {
    public static void convertDateToString(List<?> objects) throws IllegalAccessException {
        for (Object obj : objects) {
            Class<?> clazz = obj.getClass();
            Field[] fields = clazz.getDeclaredFields();

            for (Field field : fields) {
                Annotation annotation = field.getAnnotation(DateFormat.class);
                if (annotation != null && field.getType() == Date.class) {
                    field.setAccessible(true);
                    Date date = (Date) field.get(obj);
                    DateFormat dateFormatAnnotation = (DateFormat) annotation;
                    String format = dateFormatAnnotation.format();
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
                    String dateString = simpleDateFormat.format(date);
                    field.set(obj, dateString);

                    // Check if the annotation specifies a target field name
                    String targetFieldName = dateFormatAnnotation.targetField();
                    if (!targetFieldName.isEmpty()) {
                        try {
                            Field targetField = clazz.getDeclaredField(targetFieldName);
                            targetField.setAccessible(true);
                            targetField.set(obj, dateString);
                        } catch (NoSuchFieldException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
}

现在,你可以在需要进行日期转换的类中,使用DateFormat注解并指定targetField属性的值,来指定要存储转换后日期字符串的新字段的名称。例如:

public class YourClass {
    @DateFormat(format = "yyyy-MM-dd", targetField = "sdrqstr")
    private Date sdrq;
    private String sdrqstr;
    // other fields and methods...
}

在上述示例中,我们在YourClass类中使用DateFormat注解,并指定了targetField属性的值为sdrqstr,表示将转换后的日期字符串存储到sdrqstr字段中。

最后,你可以按照之前的方式创建包含需要进行日期转换的对象的List,并调用DateConverter.convertDateToString方法,日期转换后的结果将根据注解中指定的新字段名称进行存储

Search

    Post Directory