前言
提示:这里可以添加本文要记录的大概内容:
系统最近要做一个通用的excel导入功能,这里使用反射进行数据映射到实体,但是每个表格中的日期类型格式都不同,所以想通过注解的方式来处理,这里是简单记录一下一个demo。
一、示例代码
package com.glcx.poi38;
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 MyAnnotation {
String value();
}
package com.glcx.poi38;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyClass {
// 注解里面的value指定的是方法名
@MyAnnotation("method1")
private Date myDate;
public Date method1(String str) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(str);
}
public static void main(String[] args) throws Exception {
// 创建实例
Class<MyClass> clazz = MyClass.class;
// 创建对象
MyClass myClass = (MyClass) clazz.newInstance();
// 获取所有字段
Field[] declaredFields = clazz.getDeclaredFields();
// 遍历字段
for (Field field : declaredFields) {
// 获取字段上的注解,来确定执行那个方法
MyAnnotation annotation = field.getAnnotation(MyAnnotation.class);
String value = annotation.value();
Method declaredMethod = clazz.getDeclaredMethod(value, String.class);
declaredMethod.setAccessible(true);
// 执行方法
Object result = declaredMethod.invoke(myClass, "2024-03-05");
System.out.println(result);
// 也可以通过field.set到字段中
field.set(myClass, result);
System.out.println(myClass);
}
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("MyClass{");
sb.append("myInt=").append(myDate);
sb.append('}');
return sb.toString();
}
}
二、输出
Tue Mar 05 00:00:00 CST 2024
MyClass{myInt=Tue Mar 05 00:00:00 CST 2024}
总结
通过反射加注解的方式可以很方便的解决我所遇到的问题,就是碰到异常的时候还需要在优化一下,记录一下。