ASP.Net+Android+IOS开发.Net培训期待与您交流!
注解的定义
注解相当于一种标记,实质上是一种类,在程序中调用某个注解,相当于调用某个类。写代码时只需在interface前加上@符号即定义了一个注解类,在程序中加了注解就等于为程序加了某种标记,没加则没有这种标记。以后,javac编译器,开发工具和应用程序,可以用反射来了解你的类及各种元素上是否有无何种标记,看你有什么标记,就去干相应的事儿,当然注解可以加在包,类,字段,方法,方法的参数以及局部变量上。
注解并不直接影响代码的语义,但是他可以被看做是程序的工具或者类库。它会反过来对正在运行的程序语义有所影响,比如程序错了,注解提醒你,何乐而不为呢?
几种常见的注解
@SuppressWarnings("Deprecated")//取消编译器对main中过时方法的警告
public static void main(String[] args) {
char[] arrChar = new char[]{'h','e','l','l','o'};
byte[] arrByte = new byte[1024];
new String(arrChar).getBytes(0, arrChar.length, arrByte, 0);}
@Deprecated//把下面方法写成过时的
public static void sayHello(){
System.out.println("Hi");
}
@Override//这个还可以提示所写的类是不是重写
public boolean equals(Object obj){
System.out.println(obj);
return false;
}
注解的生命周期
注解是有生命周期的,默认在为ClASS阶段
CLASS 编译器将把注释记录在类文件中,但在运行时 VM 不需要保留注释。 |
RUNTIME 编译器将把注释记录在类文件中,在运行时 VM 将保留注释,因此可以反射性地读取。 |
SOURCE 编译器要丢弃的注释。 |
RetentionPolicy.SOUTCE,RetentionPolicy.ClASS,RetentionPolicy.Runtime分别对应java源文件-->java.class-->在内存中的字节码,在Override,SuppressWarnings,是SOURCE阶段,Deprecated是RUNTIME阶段
注解
@Retention(RetentionPolicy.RUNTIME)//注解的生命周期
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcastAnnotation {
}
@ItcastAnnotation(annotationAttr=@MetaAnnotation("fix"), arrayAttr = {1,2,3})
public class AnnotationTest {
}
使用自定义的注解并添加各种属性
可为原始类型(八种基本数据类型和void类型),Class类型,枚举类型,注解类型,或者以上类型的数组类
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//元注解 元信息 元数据 信息的信息
@Retention(RetentionPolicy.RUNTIME)//注解的生命周期
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcastAnnotation {
String color() default "blue";//color() 的默认值为blue
int[] arrayAttr();//如果数组只有一个数据,可以省略大括
TafficLamp TafficLamp() default TafficLamp.red;//注解的属性枚举
MetaAnnotation annotationAttr() default @MetaAnnotation("ltm");//注解的属性还是注解
}
限定注解的使用
指示注释类型所适用的程序元素的种类。如果注释类型声明中不存在 Target 元注释,则声明的类型可以用在任一程序元素上。如果存在这样的元注释,则编译器强制实施指定的使用限制。
ANNOTATION_TYPE 注释类型声明 |
CONSTRUCTOR 构造方法声明 |
FIELD 字段声明(包括枚举常量) |
LOCAL_VARIABLE 局部变量声明 |
METHOD 方法声明 |
PACKAGE 包声明 |
PARAMETER 参数声明 |
TYPE 类、接口(包括注释类型)或枚举声明 |
@Target({ElementType.METHOD)//如果没有添加ElementType.TYPE则下面会报错,因为ItcastAnnotation也是TYPE类型
public @interface ItcastAnnotation {
}
@ItcastAnnotation(annotationAttr=@MetaAnnotation("fix"), arrayAttr = 1)//如数组只有一个类型,则可省略大括号
public class AnnotationTest {
}