比如我们有一个这样的需求,在返回数据中有个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
方法,日期转换后的结果将根据注解中指定的新字段名称进行存储