Anotation注解

定义注解

格式:@interface AnnotationName
在定义注解时,会用到一些元注解(meta-annotation),如@Target和@Retention。@Target用来指明该注解的应用范围,@Retention用来指明该注解的应用级别。
如下

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Annotation {

}

注解Annotation的应用范围是METHOD;应用级别是RUNTIME,表示该注解能被虚拟机保存在class文件中。

注解内部可以包含一些元素以表示某些值,当该注解没有元素时被称为标识性注解(marker annotation),如上面的@Annotation。

Java内置了三种标准注解以及四种元注解。

标准注解
@Override:表示当前的方法要覆盖父类中的方法。若该方法的签名和父类的方法不一致就会报错。
@Deprecated:表示不建议被使用的。若使用了注解为它的元素,编译器会提出警告信息。
@SuppressWarnings:关闭不必要的编译器警告。

元注解

@Target 表示注解的应用范围,可取值为ElementType枚举值的某一个。
CONSTRUCTOR:应用于构造器
FIELD:应用于字段
LOCAL_VARABLE:应用于局部变量
METHOD:应用于方法
PACKAGE:应用于包
PARAMETER:应用月参数声明
TYPE:应用于类、接口、注解和enum
@Retention 表示注解的应用级别,可取的值为RetentionPolicy枚举值的某一个。
SOURCE:注解被编译器忽略,不保存在class文件中
CLASS:默认的级别,注解被编译器保存在class文件中,但被JVM忽略
RUNTIME:注解被编译器保存在class文件中,能被JVM读取,可以通过反射来读取该注解的信息
@Documented 将此注解包含在javadoc中
@Inherited 注解默认不能被继承,此注解能使注解被继承

注解元素

注解元素可用的类型为
 - 所有基本类型(int、float、double等)
 - Class
 - String
 - enum
 - Annotation
 - 以上类型的数组
如果使用了除以上类型以外的其他类型,编译器会报错。基本类型的包装类型Integer、Float、Double等也不能是注解的类型。
示例:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Annotation {
	String element() default "default value";//元素类型为String,元素名为element,默认值是default value
}

注解的使用

class AnnotationTest {
	@Annotation(element = "annotation test")//此注解只能应用于方法
	public void method() {

	}
}
当注解的元素名为value时,并且只使用该元素,使用的时候可以省略value,直接写该元素的值。
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface Annotation {
	String value() default "default value";
}

class AnnotationTest {
	@Annotation("annotation test")
	public void method() {

	}
}

注解的应用

注解在一些测试框架中常用到,使用注解测试框架的时候,要理解注解测试框架的流程。这里会用到java.lang.reflect.AnnotatedElement 接口中的方法。
getAnnotation(Class cl);获得摸个指定的注解
getAnnotations();获得该类的所有注解
getDeclaredAnnotation();获得该类声明的所有注解
isAnnotationPresent(Class cl);判断是否存在指定的注解
某个使用了注解的类中

Method[] methods = AnnotationTest.class.getMethods();
		for (Method method : methods) {
			if (method.isAnnotationPresent(Annotation.class)) {
				//在测试框架中,可以在判断有某个注解后执行一些必要的代码
				System.out.println(method.getName() + " " + "have annotation");
			}
		}




你可能感兴趣的:(Anotation注解)