注解:是用于描述程序如何运行以及在什么阶段来运行,注解在实际开发中最大的功能是用于替换配置文件,注解是jdk1.5的新特性,可以通过反射来让注解具有功能。
1. 自定义注解
public @interface注解名{}
例:public @interface MyAnnotation{}
注解它的本质就是一个接口,这个接口继承Annotation接口。注解类反编译后:
public interface MyAnnotation extends java.lang.annotation.Annotation{}
2. 注解中的成员
注解本质上就是接口,接口中可以有属性方法,但是注解中的每一个方法其实是申明了一个配置属性,方法的名称就是参数的名称,返回值类型就是参数的类型,可以通过default来声明参数的默认值。
public @interface MyAnnotation { int age() default 18; String name(); String value(); } |
注解参数可支持的数据类型:
① 所有基本类型
② String类型
③ Class类型
④ Enum类型
⑤ Annotation类型
⑥ 以上所有类型的一维数组
Annotation类型里面的参数只能用public或默认(default)这两个访问权修饰,如果只有一个参数成员,最好把参数名设置为value,这样使用注解的时候可以直接赋值,而不用写参数名。
例:
有一个注解: public @interface MyAnn{ String value(); } 使用:@MyAnn(“abc”) |
3. 注解的使用
使用注解的时候,如果注解中的属性没有默认值就必须要赋值:
public class Demo1 { @MyAnnotation(name="aaa",value="bbb") public void test1(){
} } |
4. 注解的反射
反射注解类
java.lang.reflect.AnnotatedElement: l <T extends Annotation> T getAnnotation(Class<T> annotationType):得到指定类型的注解引用。没有返回null。 l Annotation[] getAnnotations():得到所有的注解,包含从父类继承下来的。 l Annotation[] getDeclaredAnnotations():得到自己身上的注解。 l boolean isAnnotationPresent(Class<? extends Annotation> annotationType):判断指定的注解有没有。 Class、Method、Field、Constructor等实现了AnnotatedElement接口 |
5. 模拟@Test接口
① 定义注解类
② 使用注解
③ 模拟运行
|
6. 元注解:只能用在注解上的注解
@Retetion : 作用,改变自定义的注解的存活范围,取值:RetetionPolicy.RESOURCE\RetetionPolicy.CLASS\RetetionPolicy.RUNTIME
@Target:作用,指定注解能用在什么地方,取值:ElementType.TYPE\ ElementType.METHOD\ ElementType.FIELD\ ElementType.ANNOTATION_TYPE
@Documented:作用,一个注解类上有@Documented注解,那么使用了该注解的类的API文档上会出现这个注解的身影
@Inherited:作用,说明该注解可以被继承下去