码迷,mamicode.com
首页 > 编程语言 > 详细

Java注解

时间:2015-03-10 12:11:33      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:java

一:Java1.5起默认三个annotation类型:

@override   覆盖父类方法的注解

@SuppressWarning   忽略警告

@Deprecated   标记方法过时


二:注解的运用

注解类

@interface A{

}

应用了"注解类"的类

@A

class B{

}

对”应用了注解类的类"进行反射操作的类

class C{

   if(B.class.isAnnotationPresent(A.class)){

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

   }

}


三:为注解添加元注解

  1.配置注解的生命周期

   @Retention(RetentionPolicy.RUNTIME)        //保留到运行期间

   @Retention(RetentionPolicy.SOURCE)         //保留在Java源文件期间(默认)

   @Retention(RetentionPolicy.CLASS)             //保留在class文件期间

SO:

    @override 保留在SOURCE阶段

    @SupressWarning  保留在SOURCE阶段

    @Deprecated  保留在RUNTIME阶段

  2.配置注解的引用位置

    @Target(ElementType.METHOD)       //只能在方法上引用

    @Target({ElementType.METHOD,ElementType.Type})    //既能在类上添加又能在方法上引用


四:为注解添加属性

    @interfaceA{

     String color();      //添加属性color

     String color() default "blue" ;    //设置缺省时的默认值

     int[] arrrayAttr();         //添加数组属性 @A(arrayAttr={1,2,3})  //使用时

     EnumBase.trafficaLamp lamp() default EnumBase.trafficaLamp.Red;   //添加枚举类型属性

     MetaAnnotation  annotationAttr() default @MetaAnnotation(value="wzl")   //添加注解类型的属性

}

Ps:特殊属性 String value();

        给属性赋值时,可将value省略。即:@A("red")


五:Java代码测试:

1.测试枚举类型的属性时使用的EnumBase枚举类

 

// 编写枚举 
public class EnumBase {
 public static void main(String[] args) {
  WeekDay wd = WeekDay.MON;
  System.out.println(wd);
  System.out.println(wd.name());
  System.out.println(wd.ordinal());
  System.out.println(WeekDay.valueOf("SUN")); // 将字符串转化为枚举对象
  System.out.println(WeekDay.values().length);

  System.out.println(trafficLamp.Red.nextLamp());
 }

 public enum WeekDay {
  SUN(1), MON, SAT, TUE;
  // 编写构造方法 构造方法必须为私有private类型
  private WeekDay() {
   System.out.println("first");
  }

  private WeekDay(int day) {
   System.out.println("second");
  }
 }

 // 编写带上抽象方法的枚举
 public enum trafficLamp {
  // 枚举类熟悉相当于对象,实现抽象方法
  Red(30) {
   public trafficLamp nextLamp() {
    time--;
    System.out.println(time);
    return Green;
   }
  },
  Yellow(45) {
   public trafficLamp nextLamp() {
    return Red;
   }
  },
  Green(5) {
   public trafficLamp nextLamp() {
    return Yellow;
   }
  };
  // 抽象方法
  public abstract trafficLamp nextLamp();

  // 带参数构造方法
  public  int time;

  private trafficLamp(int time) {
   this.time = time;
  }
 }
}


2.测试注解类型的属性时的MetaAnnotation注解类

public @interface MetaAnnotation { String value(); }


3.编写注解类

/*
 * 定义注解类
 */
//元注解
//为注解设置生命周期
@Retention(RetentionPolicy.RUNTIME)
// 为注解设置引用的位置
@Target({ ElementType.METHOD, ElementType.TYPE })
public @interface annotationPoint {
 // 添加几种类型属性
 String color() default "blue"; // 默认缺省属性值

 String value(); // 特殊属性名

 int[] arrayAttr() default { 1, 2, 3 }; // 数组属性

 EnumBase.trafficLamp lamp() default EnumBase.trafficLamp.Red; // 添加枚举属性

 MetaAnnotation annotationAttr() default @MetaAnnotation("ww"); // 添加注解类型的属性
}

 

4.测试注解类中的各个属性

/*
 * 应用了"注解类"的类
 */
@annotationPoint(value = "wzl", lamp = EnumBase.trafficLamp.Green, annotationAttr = @MetaAnnotation("wzl"))
public class annotationTest {
 public static void main(String[] args) {
  // 判断是否是注解类型
  if (annotationTest.class.isAnnotationPresent(annotationPoint.class)) {
   // 得到注解对象
   annotationPoint ap = annotationTest.class
     .getAnnotation(annotationPoint.class);
   System.out.println(ap);
   // 取出注解属性值
   System.out.println(ap.color());
   // 取出枚举类型的属性的值
   System.out.println(ap.lamp().nextLamp());
   // 取出注解类型的属性值
   System.out.println(ap.annotationAttr().value());
  }
 }
}


 

 

 

Java注解

标签:java

原文地址:http://blog.csdn.net/u010366796/article/details/44172595

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!