用处
1:生成文档
常用的有@see @param @return 等:2:跟踪代码依赖性,实现替代配置文件功能。
比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减少配置文件的数量。以后java的程序开发,最多的也将实现注解配置,具有很大用处;
3:”在编译时进行格式检查。
如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
api:
1:<T extends Annotation> T getAnnotation(Class<T> annotationClass): 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null:
2:Annotation[] getAnnotations():返回该程序元素上存在的所有注解。
3:boolean isAnnotationPresent(Class<?extends Annotation> annotationClass):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.:
4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。
demo1:
/*******************************************************************************
******************************************************************************/
package test.annotation.field;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 水果颜色注解
*
* @author peida
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitColor {
/**
* 颜色枚举
*/
public enum Color {
BULE, RED, GREEN
};
/**
* 颜色属性
*
* @return
*/
Color fruitColor() default Color.GREEN;
}
/*******************************************************************************
******************************************************************************/
package test.annotation.field;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 水果名称注解
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitName {
String value() default "";
}
/*******************************************************************************
******************************************************************************/
package test.annotation.field;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 水果供应者注解
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FruitProvider {
/**
* 供应商编号
*
* @return
*/
public int id() default -1;
/**
* 供应商名称
*
* @return
*/
public String name() default "";
/**
* 供应商地址
*
* @return
*/
public String address() default "";
}
/*******************************************************************************
******************************************************************************/
package test.annotation.field;
import test.annotation.field.FruitColor.Color;
public class Apple {
@FruitName("Apple")
private String appleName;
@FruitColor(fruitColor = Color.RED)
private String appleColor;
@FruitProvider(id = 1, name = "陕西红富士集团", address = "陕西省西安市延安路89号红富士大厦")
private String appleProvider;
}
/*******************************************************************************
******************************************************************************/
package test.annotation.field;
import java.lang.reflect.Field;
public class AnnotationFiledTest {
/**
* @param args
*/
public static void main(final String[] args) {
getFruitInfo(Apple.class);
}
public static void getFruitInfo(final Class<?> clazz) {
String strFruitName = " 水果名称:";
String strFruitColor = " 水果颜色:";
String strFruitProvicer = "供应商信息:";
final Field[] fields = clazz.getDeclaredFields();
for (final Field field : fields) {
if (field.isAnnotationPresent(FruitName.class)) {
final FruitName fruitName = field.getAnnotation(FruitName.class);
strFruitName = strFruitName + fruitName.value();
System.out.println(strFruitName);
} else if (field.isAnnotationPresent(FruitColor.class)) {
final FruitColor fruitColor = field.getAnnotation(FruitColor.class);
strFruitColor = strFruitColor + fruitColor.fruitColor().toString();
System.out.println(strFruitColor);
} else if (field.isAnnotationPresent(FruitProvider.class)) {
final FruitProvider fruitProvider = field.getAnnotation(FruitProvider.class);
strFruitProvicer = strFruitProvicer + fruitProvider.id() + ";" + fruitProvider.name() + ";" + fruitProvider.address();
System.out.println(strFruitProvicer);
}
}
}
}
水果名称:Apple
水果颜色:RED
供应商信息:1;陕西红富士集团;陕西省西安市延安路89号红富士大厦
demo2:
/*******************************************************************************
******************************************************************************/
package test.annotation.method;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 定义一个注解
*/
@Target(ElementType.METHOD)
// 这是一个对方法的注解,还可以是包、类、变量等很多东西
@Retention(RetentionPolicy.RUNTIME)
// 保留时间,一般注解就是为了框架开发时代替配置文件使用,JVM运行时用反射取参数处理,所以一般都为RUNTIME类型
@Documented
// 用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化
public @interface OneAnnotation {
// 定义注解的参数,类型可以为基本类型以及String、Class、enum、数组等,default为默认值
String parameter1() default "";
int parameter2() default -1;
}
/*******************************************************************************
******************************************************************************/
package test.annotation.method;
/**
* 一个用到了自定义的注解的类
*/
public class OneClass {
@OneAnnotation(parameter1 = "YES", parameter2 = 10000)
public void oneMethod() {
}
}
/*******************************************************************************
******************************************************************************/
package test.annotation.method;
import java.lang.reflect.Method;
public class AnnotationMethodTest {
public static void main(final String[] args) throws Exception {
// 提取到被注解的方法Method,这里用到了反射的知识
final Method method = Class.forName("test.annotation.method.OneClass").getDeclaredMethod("oneMethod");
// 从Method方法中通过方法getAnnotation获得我们设置的注解
final OneAnnotation oneAnnotation = method.getAnnotation(OneAnnotation.class);
// 得到注解的俩参数
System.out.println("para1: " + oneAnnotation.parameter1());
System.out.println("para2: " + oneAnnotation.parameter2());
}
}
para1: YES
para2: 10000
。