反射与注解
通过例子来说,更加清晰明了、记忆深刻(这里都不在解释反射与注解,直接合体使用)
1、首先自定义一个注解
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
@Retention(RUNTIME)
public @interface FieldInfo
{
String format();
int type();
}
2、自定义一个pojo类吧(pojo类就是简单地有属性、默认构造方法、set/get方法的简单Java类)
import java.util.Date;
import my.annotation.Example;
import my.annotation.FieldInfo;
public class Student
{
private Integer id; // 学号dss
private String name; // 姓名
private Boolean sex; // 性别
private String cellphone; // 手机号
@FieldInfo(format = "yyyy-MM-dd", type = 1)
private Date birthday;
// 默认构造方法
public Student()
{
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Boolean getSex()
{
return sex;
}
public void setSex(Boolean sex)
{
this.sex = sex;
}
public String getCellphone()
{
return cellphone;
}
public void setCellphone(String cellphone)
{
this.cellphone = cellphone;
}
@Override
public String toString()
{
return "学号:" + id +", 姓名:" + name;
}
public Date getBirthday()
{
return birthday;
}
public void setBirthday(Date birthday)
{
this.birthday = birthday;
}
}
3、测试,使用
import java.lang.reflect.Field;
import my.annotation.FieldInfo;
public class Test
{
public static void main(String[] args) throws Exception
{
Class cls = Class.forName("my.Student");
Field field = cls.getDeclaredField("birthday");
//检查field是否定义了FieldInfo注解
if(field.isAnnotationPresent(FieldInfo.class))
{
//取得fieldInfo的注解对象
FieldInfo a = field.getAnnotation(FieldInfo.class);
//取得参数的值
String format = fieldInfo.format();
int type = fieldInfo.type();
System.out.println(format + "**" + type);
}
}
}
反射与注解框架设计
比如:在我们POJO转JSON的时候,假如POJO类中有Date属性,那么我们就不知道该转成哪种日期格式,
解决办法:定义注解,在注解中规定日期格式(方式简单,行为明了,改动方便)
1、定义注解
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
@Retention(RUNTIME)
public @interface FieldInfo
{
String format();
}
2、定义pojo类(在Date字段声明注解)
import java.util.Date;
import my.annotation.Example;
import my.annotation.FieldInfo;
public class Student
{
private Integer id; // 学号dss
private String name; // 姓名
private Boolean sex; // 性别
private String cellphone; // 手机号
@FieldInfo ( format="yyyy-MM-dd" )
private Date birthday;
// 默认构造方法
public Student()
{
}
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Boolean getSex()
{
return sex;
}
public void setSex(Boolean sex)
{
this.sex = sex;
}
public String getCellphone()
{
return cellphone;
}
public void setCellphone(String cellphone)
{
this.cellphone = cellphone;
}
@Override
public String toString()
{
return "学号:" + id +", 姓名:" + name;
}
public Date getBirthday()
{
return birthday;
}
public void setBirthday(Date birthday)
{
this.birthday = birthday;
}
}
3、写一个工具类(通过属性名获得set/get方法)
public class AfReflect
{
// 字段名 -> Getter名
public static String getterName(String field)
{
// "name" -> "getName()"
char firstChar = Character.toUpperCase(field.charAt(0));
StringBuffer strbuf = new StringBuffer("get" + field);
strbuf.setCharAt(3, firstChar);
return strbuf.toString();
}
// 字段名 -> Setter名
public static String setterName(String field)
{
// "name" -> "setName()"
char firstChar = Character.toUpperCase(field.charAt(0));
StringBuffer strbuf = new StringBuffer("set" + field);
strbuf.setCharAt(3, firstChar);
return strbuf.toString();
}
}
4、pojo =》 json类
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import org.json.JSONObject;
import af.common.reflect.AfReflect;
import my.annotation.FieldInfo;
public class Util
{
public static JSONObject POJO2JSON (Object obj)
{
//获取class信息
Class cls = obj.getClass();
//取得所有属性的描述
Field[] fields = cls.getDeclaredFields();
//结果为JSONObject
JSONObject json = new JSONObject();
for(Field field : fields)
{
String fieldName = field.getName();
String getterName = AfReflect.getterName(fieldName);
try
{
Method getter = cls.getMethod(getterName);
Object value = getter.invoke(obj);
if(value == null)continue;
//对日期进行处理
if(value instanceof java.util.Date)
{
String format = "yyyy-MM-dd HH:mm:ss";
if(field.isAnnotationPresent(FieldInfo.class))
{
FieldInfo a = field.getAnnotation(FieldInfo.class);
format = a.format();
}
SimpleDateFormat sdf = new SimpleDateFormat(format);
value = sdf.format(value);
}
//存到json中
json.put(fieldName, value);
}
catch(Exception e)
{
}
}
return json;
}
}
5、测试
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.json.JSONObject;
public class Test
{
public static void main(String[] args)
{
Student s = new Student(); // POJO 对象
s.setId(20190001);
s.setName("邵发");
s.setSex(true);
s.setCellphone("13810012345");
s.setBirthday(new Date());
s.setLoginDate(new Date());
// POJO -> JSON
JSONObject j1 = Util.POJO2JSON(s);
System.out.println(j1.toString(2));
System.out.println("Exit");
}
}