反射与注解

反射与注解

通过例子来说,更加清晰明了、记忆深刻(这里都不在解释反射与注解,直接合体使用)

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");
    	}
    
    }

 

 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值