首页 > 代码库 > 黑马程序员-张老师基础加强4-注解

黑马程序员-张老师基础加强4-注解

注解:

注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。

注解:

 @interface A{

}     

应用了注解的类:   

@                  

class B{

  

}  

对应用了注解的类记性反射操作                         

class C{

B.class.isAnnotionPresent(A.class); 

  A a = B.class.getAnnotion( A.class);

}                                              

 注解的应用; 

2.    添加元注解:Retention,Target

@Retention(RetentionPolicy.RUNTIME)//元注解,

@Target({ElementType.METHOD,ElementType.TYPE})//标记方法和类注解(TYPE),多个则用数组。

public @interface DemoAnnotation {

}

元注解:Rentetion.SOURCE ;Retention.RUNTIME;Retention.CLASS.分别对应:java源文件-->class文件-->内存中的字节码。

注:class文件,只有加载内存中才是字节码文件。

RetentionPolicy.RUNTIME:保留到运行阶段

RetentionPolicy.CLASS:

RetentionPolicy.SOURCE:编译期

2.应用了注解类的类。

 @DemoAnnotation

@BindingType

class DemoAnotation1_1{ 

}

3.对“应用了注解类的类”进行反射操作的类。检查是否有注解,并获取。

boolean flag = DemoAnotation1_1.class.isAnnotationPresent(DemoAnnotation.class);

       Annotation[] ans =  DemoAnotation1_1.class.getAnnotations();

注解的生命周期有三个阶段:

java源文件是一个阶段:

class文件是一个阶段:

内存中的字节码是一个阶段:

javac把java源文件编译成.class文件时,有可能去掉里面的注解, 类加载器把.class文件加载到内存时也有可能去掉里面的注解,

此在自定义注解时就可以使用Retention注解指明自定义注解的生命周期,  自定义注解的生命周期是在RetentionPolicy.SOURCE阶段(java源文件阶段),

还是在RetentionPolicy.CLASS阶段(class文件阶段), 或者是在RetentionPolicy.RUNTIME阶段(内存中的字节码运行时阶段), 根据JDK提供的API

可以知道默认是在RetentionPolicy.CLASS阶段 (JDK的API写到:the retention policy defaults to RetentionPolicy.CLASS.)

注解的属性

注解中添加属性:

@Retention(RetentionPolicy.RUNTIME)

public @interface DemoAnnotation2 {

    String color();//注意是方法。注解相当于接口,它的属性相当于方法,是public final.

    int size() default 30;

    String value();//当注解中只有一个属性时(不包括dafault),可以写成@SuppressWarnings("deprecation")样式

    int[] arr();//添加数组。

    DemoAnnotation Anno() default @DemoAnnotation;//注解中添加注解

    MeteAnnotation annotation() default @MeteAnnotation("获取注解对象@别忘了写");

    //如何创建一个注解的实例对象。直接加上@就行了。

    public @interface MeteAnnotation {

       String value();

    }}

注:注解的属性类型包括:基本数据类型,String,Class,枚举,其他注解,以及这些类型的数组(当数组中只有一个元素时,可以不加大括号)。

使用注解中的属性,并获取

@DemoAnnotation2(color = "red", arr = {1,0}, value = "http://www.mamicode.com/deprecation")

public class DemoAnnotation3 { 

public static void main(String[] args) {

       DemoAnnotation2 an = DemoAnnotation3.class.getAnnotation(DemoAnnotation2.class);

       System.out.println(an.color());//如调用方法变调用      System.out.println(an.annotation().value());//调用注解中的注解的方法。

    }}