package com.metarnet.model;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 注释测试
* @author yanfan
* 不使用已指定的数据类型,而使用注释来标注其数据类型
* 其中有四个类:MainTest(主函数,用于测试)
* TestNote(MODEL,用于存放数据)
* NoteEnum(定义注释中的属性可以存放的值)
* Note(注释)
* 使用@Note(Name=NoteEnum.String)来标注一个数据
*/
public class MainTest {
public static void main(String[] args) {
TestNote note = new TestNote();
try {
note.setTestInt(123);
note.setTestDate(new Date());
note.setTestString("Test");
//note.setTestString("Test");
System.out.println("TestDate:"+note.getTestDate());
System.out.println("TestInt:"+note.getTestInt());
System.out.println("TestString:"+note.getTestString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 在此声明三个参数,全部使用String类型,但使用注释标注它的类型
* @author yanfan
*
*/
class TestNote {
@Note(Name=NoteEnum.String)
protected String TestString;
@Note(Name=NoteEnum.Int)
protected String TestInt;
@Note(Name=NoteEnum.Date)
protected String testDate;
public Object getTestString() throws Exception {
return GET("TestString");
}
public void setTestString(Object testString) throws Exception{
SET("TestString", testString);
}
public Object getTestInt() throws Exception {
return GET("TestInt");
}
public void setTestInt(Object testInt) throws Exception{
SET("TestInt", testInt);
}
public Object getTestDate() throws Exception {
return GET("testDate");
}
public void setTestDate(Object testDate) throws Exception{
SET("testDate", testDate);
}
private void SET(String Name,Object value) throws Exception
{
Field field = TestNote.class.getDeclaredField(Name);
if(field.getAnnotation(Note.class).Name() == NoteEnum.Date)
{
field.set(this,new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(value));
}else if(field.getAnnotation(Note.class).Name() == NoteEnum.Int){
field.set(this,value.toString());
}else {
field.set(this,value);
}
}
private Object GET(String Name)throws Exception
{
Field field = TestNote.class.getDeclaredField(Name);
if(field.getAnnotation(Note.class).Name() == NoteEnum.Date)
{
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(field.get(this).toString());
}else if(field.getAnnotation(Note.class).Name() == NoteEnum.Int){
return Integer.parseInt(field.get(this).toString());
}else {
return field.get(this).toString();
}
}
}
/**
* 定义可以在注释中选择的参数
* @author yanfan
*
*/
enum NoteEnum {
String,
Date,
Int
}
/**
* 定义一个可以使用在参数上的注释
* @author yanfan
*
*/
/**
* CONSTRUCTOR : 构造器的声明
* FIELD : 域声明(包括enum实例)
* LOCAL_VARIABLE : 局部变量声明
* METHOD : 方法声明
* PACKAGE : 包声明
* PARAMETER : 参数声明
* TYPE : 类、接口 (包括注解类型) 或enum声明
*/
@Target(ElementType.FIELD)
/**
* SOURCE : 注释将被编译器丢掉
* CLASS : 注释在class文件中可用,但会被VM丢弃
* RUNTIME : VM将在运行时也保留注释,因此可以通过反射机制读取注释的信息。
*/
@Retention(RetentionPolicy.RUNTIME)
@interface Note {
public NoteEnum Name();//返回为枚举类型
}
(这是执行正确返回的值,可以明显的看出来其数据类型)
当我将测试类型设置为这个之后,