《黑马程序员》了解java中的注解

来源:互联网 发布:creis中指数据 账号 编辑:程序博客网 时间:2024/05/01 21:05

 

注解是jdk1.5以后提供的新特性。

1.注解(Annotation):一个注解就是一个类,:注解是向编译器传达一种信息,一个类中可以有多个注解。它为我们在代码中添加信息提供了一种形式化的方法,使我们可以在以后

  某个时刻方便地使用这些数据(通过解析注解来使用这些数据)。也可以把注解看做一种标记,加了注解就等于打上了某种标记,没加,则等于没有某种标记
       
,以后javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素
       
上有无何种标记,看你有什么标记,就去干相应的事。注解可以加在包,类,字段,
       
方法,方法的参数以及局部变量上。

  注解的语法比较简单,它必须使用@开头,后面是注解的关键字。下面我们来介绍java中常用的一些注解:

        @Override覆盖) 表示当前方法是覆盖父类的方法。

  @Deprecated(过时): 表示当前元素是已经过时的,不建议使用。

  @SuppressWarnings压缩警告)该注解想开发工具或者说是编译器应该应怎么做。例如代码:

        @SuppressWarnings("deprecation")

        System.runFinalizersOnExit(true);//deprecated过时的

        是告诉编译器去掉runFinalizersOnExit的过时警告。

   

     下面是一个定义注解的实例

2.1定义一个注解类:

 

package cn.itext.day2;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import cn.itext.day1.EnumTest;

/*表示这个ItcastAnnocation一直保持到程序运行阶段,若无
 * @Retention(RetentionPolicy.RUNTIME)则(ItcastAnnocation)默认是保存在
 * class阶段
 ,而不会在编译时去掉(编译时会去掉注解)
 */
/*此处为什么要用TYPE而不是用CLASS:因为TYPE是一个接口,
 并且是Class的父类 ,他不仅可以加在类上面,还可以加在class上面,
 也可以加在枚举上面。所以用TYPE更准确。(Type也是1.5才出现的)*/
//@Target(ElementType.METHOD)表示这个注解只能放在方法上
//这个注解是为ItcastAnnocation服务的(注解的注解)也加元注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface ItcastAnnocation {
 /*
  * default表示属性值是默认的,设置默认之后 可以在使用注解时,不设置属性值。
  */
 String value();

 String color() default "blue";

 /*
  * 为注解增加高级属性:数组类型,枚举类型,注解类型
  */
 int[] arrayAttr() default { 2, 3, 4 };

 EnumTest.Trafficclamp lemp() default EnumTest.Trafficclamp.RED;

 MetaAnnotation annotationAtrr() default @MetaAnnotation("lhm");

}

在注解类中加的注解:加做元注解

@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
:因为一个注解的生命周期有三个阶段:java源文件阶段--class文件----》内存中的字节码

使用Retention(RetentionPolicy.RUNTIME):表示这个注解的生命周期保留在RUNTIME阶段。

2.2创建AnnotationTest类用于应用注解类,对注解类进行一系列的操作:

 

package cn.itext.day2;

import java.lang.annotation.Annotation;

//1.为注解设值是以属性的方式。
@ItcastAnnocation(annotationAtrr = @MetaAnnotation("flx"), color = "red", value = "abc", arrayAttr = 1)
// 表示AnnotationTest中有了这个注解的对象
public class AnnotationTest {
 @SuppressWarnings("deprecation")
 @ItcastAnnocation("xyz")
 // 3.如果只有一个value属性要赋值则不用写"color=",直接写属性值
 public static void main(String[] args) throws Exception {
  // TODO Auto-generated method stub
  System.runFinalizersOnExit(true);// deprecated过时的
  // ItcastAnnocation.class获得注解的字节码是在运行阶段
  if (AnnotationTest.class.isAnnotationPresent(ItcastAnnocation.class)) {
   // 用反射检查AnnotationTest类
   // 得到注解
   ItcastAnnocation annotation = AnnotationTest.class
     .getAnnotation(ItcastAnnocation.class);
   // 得到注解的值时,还是用方法的方式获得(获得方法的返回值)
   System.out.println(annotation.color());
   System.out.println(annotation.value());
   System.out.println(annotation.arrayAttr().length);
   // 枚举类型
   System.out.println(annotation.lemp().nextLamp().name());
   System.out.println(annotation.annotationAtrr().value());
  }
 }

 @Deprecated
 @ItcastAnnocation(color = "red", value = "abc")
 // 表示AnnotationTest中有了这个注解的对象
 public static void sayHello() {
  System.out.println("hi,黑马");
 }
}

原创粉丝点击