java自定义Annotation(载自百度文库)
java中自定义annotation需要@interface关键字和用到几个内置annotation。
用到的注解有@Target,@Retention,@Documented,@Inherited ,用途如下:
@Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括:
ElemenetType.CONSTRUCTOR 构造器声明
ElemenetType.FIELD 域声明(包括 enum 实例)
ElemenetType.LOCAL_VARIABLE 局部变量声明
ElemenetType.METHOD 方法声明
ElemenetType.PACKAGE 包声明
ElemenetType.PARAMETER 参数声明
ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
@Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
RetentionPolicy.SOURCE 注解将被编译器丢弃
RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
@Documented 将此注解包含在 javadoc 中
@Inherited 允许子类继承父类中的注解
@Documented的目的就是让这一个Annotation类型的信息能够显示在javaAPI说明文档上;
没有添加的话,使用javadoc生成API文档的时候就会找不到这一个类型生成的信息.
另外一点,如果需要把Annotation的数据继承给子类,那么就会用到@Inherited这一个。
下面自定义两个简单的annatation。 package annotation;
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.TYPE)
@Retention(RetentionPolicy.RUNTIME) @Documented
public @interface Description {
String value() default "no description";
}
package annotation;
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)
@Documented
public @interface Name {
String originate();
String community();
}
package annotation;
@Description("javaeye, to be best")
public class JavaEyer {
@Name(originate = "创始人:robbin", community = "javaeye")
public String getEyeName() {
return null;
}
@Name(originate = "创始人:江南白衣", community = "springside")
public String getSideName() {
return "excuse me";
}
}
package annotation;
import java.lang.reflect.Method;
import java.util.HashSet; import java.util.Set;
public class AnnotationTest {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws ClassNotFoundException {
final String CLASS_NAME = "annotation.JavaEyer";
Class test = Class.forName(CLASS_NAME);
Method[] methods = test.getMethods();
boolean flag = test.isAnnotationPresent(Description.class);
if (flag) {
Description des = (Description) test.getAnnotation(Description.class);
System.out.println("描述:" + des.value());
System.out.println("-----------------");
}
Set<Method> set = new HashSet<Method>();
for (int i = 0; i < methods.length; i++) {
boolean otherflag = methods[i].isAnnotationPresent(Name.class);
if (otherflag) {
set.add(methods[i]);
}
}
for (Method method : set) {
Name name = method.getAnnotation(Name.class);
System.out.println(name.originate());
System.out.println("创建的社区:" + name.community());
}
}