设计自己的Annotation
【IT168技术文档】
第三部分:下面讲的设计一个最简单的Annotation例子,这一例子共用四个文件;
1、Description.java
代码
说明:所有的Annotation会自动继承java.lang.annotation这一个接口,所以不能再去继承别的类或是接口.package lighter.javaeye.com;
![]()
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();
}
最重要的一点,Annotation类型里面的参数该怎么设定:
第一,只能用public或默认(default)这两个访问权修饰.例如,String value();这里把方法设为defaul默认类型.
第二,参数成员只能用基本类型byte,short,char,int,long,float,double,boolean八种基本数据类型和String,Enum,Class,annotations等数据类型,以及这一些类型的数组.例如,String value();这里的参数成员就为String.
第三,如果只有一个参数成员,参数名称一定要为"value",后加小括号.例:上面的例子就只胡一个参数成员.
2、Name.java
代码
3、JavaEyer.javapackage lighter.javaeye.com;
![]()
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与@Description里的不同,参数成员也不同
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Name ...{
String originate();
String community();
}
代码
4、最后,写一个可以运行提取JavaEyer信息的类TestAnnotationpackage lighter.javaeye.com;
![]()
@Description("javaeye,做最棒的软件开发交流社区")
public class JavaEyer ...{
@Name(originate="创始人:robbin",community="javaEye")
public String getName()
...{
return null;
}
![]()
@Name(originate="创始人:江南白衣",community="springside")
public String getName2()
...{
return "借用两位老大的id,写这一个例子,请见谅!";
}
}
代码
package lighter.javaeye.com;
![]()
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Set;
![]()
public class TestAnnotation ...{
/**//**
* author lighter
* 说明:具体关天Annotation的API的用法请参见javaDoc文档
*/
public static void main(String[] args) throws Exception ...{
String CLASS_NAME = "lighter.javaeye.com.JavaEyer";
Class test = Class.forName(CLASS_NAME);
Method[] method = 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("-----------------");
}
![]()
//把JavaEyer这一类有利用到@Name的全部方法保存到Set中去
Set<Method> set = new HashSet<Method>();
for(int i=0;i<method.length;i++)
...{
boolean otherFlag = method[i].isAnnotationPresent(Name.class);
if(otherFlag) set.add(method[i]);
}
for(Method m: set)
...{
Name name = m.getAnnotation(Name.class);
System.out.println(name.originate());
System.out.println("创建的社区:"+name.community());
}
}
}
0
相关文章
