标签: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
原文地址:http://blog.csdn.net/u010366796/article/details/44172595