注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,Javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
1)定义一个最简单的注解
public @interface MyAnnotation {
//......
}
2)把注解加在某个类上:
@MyAnnotation
public class AnnotationTest{
//......
}
我们的常量类注解如下:
package com.gaochao.platform.util;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 常量中文转换注解
* @author chao.gao
* @date 2013-12-20 下午1:02:02
* @version <b>1.0.0</b>
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ConstantsText {
/**
* 数据字典的label,获取中文含义时使用
* @author chao.gao
* @date 2013-12-20 下午1:17:19
* @return
*/
public String termsLable() default "";
/**
* 当数据字典中不存在对面的中文时使用,手动设置
* @author chao.gao
* @date 2013-12-20 下午1:17:40
* @return
*/
public String text() default "";
}
注解的上方有两个元注解,是注解的注解,含义及用法如下:
//Java中提供了四种元注解,专门负责注解其他的注解,分别如下
//@Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。可选的RetentionPoicy参数包括:
//RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉
//RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)
//RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息
//@Target元注解,默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括
//ElementType.CONSTRUCTOR: 构造器声明
//ElementType.FIELD: 成员变量、对象、属性(包括enum实例)
//ElementType.LOCAL_VARIABLE: 局部变量声明
//ElementType.METHOD: 方法声明
//ElementType.PACKAGE: 包声明
//ElementType.PARAMETER: 参数声明
//ElementType.TYPE: 类、接口(包括注解类型)或enum声明
//@Documented将注解包含在JavaDoc中
//@Inheried允许子类继承父类中的注解
在常量类中应用注解:
1
2
3
4
5
6
7
8 public class RelationshipConstants {
public static final String STATUS_SAVED = "saved";
public static final String STATUS_FINISHED = "finished";
public static final int HAVE_YES = 1;
public static final int HAVE_NO = 0;
}
添加注解后
/**
* 计划状态:已审核
*/
@ConstantsText(text = "我是手动审核")
public static final String PLANSTATUS_AUDITED = "audited";
/**
* 计划状态:已作废,从数据字典查找
*/
@ConstantsText(termsLable = "planStatus")
public static final String PLANSTATUS_CANCELED = "canceled";
/**
* 计划状态:已完结
*/
@ConstantsText(termsLable = "planStatus")
public static final String PLANSTATUS_FINISHED = "finished";
解释注解:
public static String getText(Field field) throws Exception {
String fieldValue = field.get(null).toString();
if (field.isAnnotationPresent(ConstantsText.class)) {
ConstantsText ct = field.getAnnotation(ConstantsText.class);
if (!StringUtils.isBlank(ct.text())) {
return ct.text();
}
if (!StringUtils.isBlank(ct.termsLable())) {
String resultStr = "";
if (map.get(ct.termsLable()) != null) {
resultStr = map.get(ct.termsLable()).get(fieldValue);
} else {
logger.error("数据字典中未找到:termsLable:[" + ct.termsLable() + "]!");
}
if (resultStr != null)
return resultStr;
else {
logger.error("数据字典中未找到termslable:[" + ct.termsLable() + "],termsCode:[" + fieldValue + "]的对应值!");
}
}
}
return fieldValue;
}
}
生成js的逻辑: