注解 Annotation
一个注解就是一个类
@SuppressWarnings("deprecation") 源文件阶段
@Override 重写 源文件阶段
@Deprecated 过时 RUNTIME阶段
注解类
@interface A{
}
应用了“注解类”的类
@A
class B{
}
注解反射
class C{
B.class.isAnnotationPresent(A.class)
A a=B.class.getAnnotation(A.class)
}
@Retention元注解
RetetionPolicy.SOURCE 对应源文件
RetetionPolicy.CLASS 对应class文件
RetetionPolicy.RUNTIME 内存中的字节码
RetetionPolicy是枚举,
只包含 SOURCE,CLASS,RUNTIME三个元素
1 //注解类
2 import java.lang.annotation.ElementType;
3 import java.lang.annotation.Retention;
4 import java.lang.annotation.RetentionPolicy;
5 import java.lang.annotation.Target;
6
7 @Retention(RetentionPolicy.RUNTIME)
8 @Target({ElementType.METHOD,ElementType.TYPE})
9 //Target 参数 一个可以,两个以上 参数为数组
10 //注解的注解目标({方法,类}) 描述class,interface enum 的父类都是TYPE
11 public @interface MyAnnotation {
12 //为注解添加属性,这里的属性就是方法,不需要加public abstract。系统默认加
13 String color() default "blue"; //为属性增加默认值
14 String value(); //当只有一个value属性时,赋值时可以不用value=
15
16 }
17
1 //注解的使用
2 @MyAnnotation(color="red",value="444")
3
4 public class AnnotationTest {
5
6 /**
7 * @param args
8 */
9 @SuppressWarnings("deprecation")
10 @MyAnnotation("bacd")
11 public static void main(String[] args) {
12 // TODO Auto-generated method stub
13 System.runFinalizersOnExit(true);
14 //判断字节码中是否有注解,不加RUNTIME则没有,字节码在内存中,RUNTIME内存运行阶段
15 if(AnnotationTest.class.isAnnotationPresent(MyAnnotation.class))
16 {
17 MyAnnotation myAnnotation=(MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
18 System.out.println(myAnnotation.color());
19 }
20 }
21
22 }
23