Annotation
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
java.lang包中的注解
@SuppressWarnings :在注释元素(以及包含在该注释元素中的所有程序元素)中取消显示指定的编译器警告.
例如 @SuppressWarnings("deprecation")取消编译器放出的方法过时警告,在编译过时方法时,编译器不会再发出警告,
@SuppressWarnings(String[])其中传入的值为一个String数组,如只有一个值可以直接将值写入
@@Deprecated 用于标记在方法上,表示此方法已过时,
@Override 重写注解,表示此方法是从父类重写而来的,可减少重写的错误率.
<span style="font-size:12px;">public class AnnotationTest {
@SuppressWarnings("deprecation")
public static void main(String[] args) {
System.runFinalizersOnExit(true);
}
@Deprecated
public void sayHellow(){
System.out.println("Hellow");
}
@Override
public String toString(){
return null;
}
}
</span>
注解的应用方法:使用注解需要3个类:注解类,使用了注解的类和对使用了注解的类进行反射的类.
创建注解:
@interface用于创建注解
<span style="font-size:12px;">public @interface AnnotationMake {
String value();
}</span>
元注解:
可以理解为注解的注解,用在注解类上
@Target(ElementType[])指示注释类型所适用的程序元素的种类,如方法,类,字段,注解等。如未指定@Target代表创建的注解可以在任意地方使用,若已指定九只能在指定的地方使用.@Target可以设置多个参数,但是必须将参数放在数组里
ElementType 为一个枚举.枚举提供货Java 程序中声明的元素的简单分类. 注意: 类的常量是TYPE;
@Retention(RetentionPolicy) 指示注释类型的注释要保留多久;
RetentionPolicy中有三个常量SOURCE,CLASS,RUNTIME分别表示java类运行的三个阶段
SOURCE:为java源文件阶段,编译器要丢弃的注释.
CLASS:CLASS文件,在字节码加载到内存前会丢弃.
RUNTIME: 运行时阶段,加载到内存后仍然保留
注解的属性
属性的创建跟方法类似
String color() default "qw"; String为属性类型 color 为属性名 default 为缺省值
value属性如果注解中有一个名称为value的属性,且你只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分,直接写值
数组类型的属性
int []arrayAttr()default {1,2,3};
@MyAnnotation(arrayAttr={2,3,4})
如果数组属性中只有一个元素,这时候属性值部分可以省略大括
枚举类型的属性
EnumTest.TrafficLamp lamp() ;
@MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)
注解类型的属性:
MetaAnnotationannotationAttr()default @MetaAnnotation("xxxx");
@MyAnnotation(annotationAttr=@MetaAnnotation(“yyy”))
<span style="font-size:14px;">@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface ItheimaAnnotation {
String color() default "red";
int[] value();
Lamp lamp() default Lamp.E2N;
AnnotationMake annotation() default @AnnotationMake("dd");
Class classzz() default String.class;
}
</span>
注解的使用与反射
注解的赋值为 属性名 = 值 除value属性在一些情况下可以省去属性名外其他都需要写上属性名.有缺省值得属性可以不赋值.数组属性在只有一个元素时可以省略大括.
可以通过反射类中的注解得到注解的属性
@ItheimaAnnotation(color="green", value={1,2,3}, lamp=Lamp.N2E, annotation=@AnnotationMake("aa"), classzz=Integer.class)
public class annotationTest {
@ItheimaAnnotation(1)
public static void main(String[] args) {
if(annotationTest.class.isAnnotationPresent(ItheimaAnnotation.class)){
ItheimaAnnotation annotation = annotationTest.class.getAnnotation(ItheimaAnnotation.class);
System.out.println(annotation);
System.out.println(annotation.color());
System.out.println(annotation.value().length);
System.out.println(annotation.lamp());
System.out.println(annotation.annotation());
System.out.println(annotation.classzz());
}
}
}