SOURCE:在源文件中有效(即源文件保留)
CLASS:在class文件中有效(即class保留)
RUNTIME:咋运行时有效(即运行时保留)
@Documented
@Documented用于描述其他类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。
@Inherited
@Inherited元注解是一个标记注解,它表示了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。
注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。
当@Inherited annotation类型标注的annotation的Retention是RetentionPolicy.RUNTIME,则发射API增强了这种继承性。如果我们使用java.lang.reflect去查询一个@Inherited annotation类型的annotation时,反射代码检查将展开工作:检查class和其父类,直到发现指定的annotation类型被发现,或者到达类继承结构的顶层。
自定义注解(Annotation)
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。@interface用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。
定义注解格式:
public @interface 注解名 {定义体}
注解参数的可支持数据类型:
所有基本数据类型(int,float,boolean,byte,double,char,long,short)
String类型
Class类型
enum类型
Annotation类型
以上所有类型的数组
自定义注解(Annotation)示例
package org.grape.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;
/*
* 作者信息注解
* @author grape
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface Author {
String name() default "";
String group() default "";
}1
package org.grape.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;
/*
* 类描述注解
* @author grape
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Description {
String value() default "";
}1
package org.grape.annotation;
@Description(value="这是一个有用的工具类")
public class Utility {
@Author(name="jlq",group="grape")
public String work(){
return "work over!";
}
}
提取注解
package org.grape.annotation;
import java.lang.reflect.Method;
public class AnalysisAnnotation {
public static void main(String[] args) {
try {
Class rt_class = Class.forName("org.grape.annotation.Utility");
Method[] methods = rt_class.getMethods();
boolean flag = rt_class.isAnnotationPresent(Description.class);
if (flag) {
Description description = (Description) rt_class
.getAnnotation(Description.class);
System.out.println("Utility's Description---->"
+ description.value());
for (Method method : methods) {
if(method.isAnnotationPresent(Author.class)){
Author author = (Author)method.getAnnotation(Author.class);
System.out.println("Utility's Author---->" + author.name() + " from " + author.group());
}
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}