-------android培训、java培训、期待与您交流!
----------
About 注解
注解相当于一种标记,在程序中加了注解就等于为程序打上了某种标记,没加,则等于没有某种标记,以后,javac编译器,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记,就去干相应的事。标记可以加在包,类,字段,方法,方法的参数以及局部变量上。
看java.lang包,可看到JDK中提供的最基本的annotation
1、注解的应用结构图
Code1
@ItcastAnnotation(value = "abc",annotationAttr=@MetaAnnotation("MetaAnnotation")) public class AnnotationTest { @SuppressWarnings("deprecation") public static void main(String[] args) throws Exception { System.runFinalizersOnExit(true); if(AnnotationTest.class.isAnnotationPresent(ItcastAnnotation.class)){ ItcastAnnotation annotation = AnnotationTest.class.getAnnotation(ItcastAnnotation.class); System.out.println(annotation.getClass().getName()); System.out.println(annotation.color());//用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法 System.out.println(annotation.value()); System.out.println(annotation.num().length); System.out.println(annotation.lamp().nextLamp()); System.out.println(annotation.annotationAttr()); } } @Deprecated public static void sayHello(){ System.out.println("HI"); } }
Code2 --注解类
@Retention(RetentionPolicy.RUNTIME) //@Retention元注解.RetetionPolicy.SOURCE、RetetionPolicy.CLASS、RetetionPolicy.RUNTIME;分别对应:java源文件-->class文件-->内存中的字节码。 @Target({ElementType.METHOD,ElementType.TYPE}) //@Target元注解默认值为任何元素,设置Target等于ElementType.METHOD,原来加在类上的注解就报错,改为用数组方式设置{ElementType.METHOD,ElementType.TYPE} public @interface ItcastAnnotation { String color() default "blue"; //为属性指定缺省值 String value();//如果注解中有一个名为value的属性,且只想设置value属性(即其他属性都采用默认值或者你只有一个value属性),那么可以省略value=部分 int [] num () default {11,22,33};//数组类型的属性 EnumTest.TrrificLamp lamp() default EnumTest.TrrificLamp.RED;//枚举类型的属性 MetaAnnotation annotationAttr() default @MetaAnnotation("Meta");//注解类型的属性 }
Code3--注解类
public @interface MetaAnnotation { String value(); }
Code4--枚举类
public class EnumTest { public static void main(String[] args) { WeekDay1 weekDay = WeekDay1.TUE; System.out.println(weekDay.nextDay()); System.out.println(WeekDay1.FRI.getClass().getName()); System.out.println(WeekDay1.class.getName()); System.out.println(WeekDay.SUN); System.out.println(WeekDay.valueOf("SAT")); System.out.println(WeekDay.values().length); System.out.println(WeekDay.class.getName()); System.out.println(TrrificLamp.GREEN.nextLamp().time); System.out.println(TrrificLamp.RED.nextLamp()); } //每个枚举对象都会产生相应的class文件 public enum WeekDay { SUN, MON(1), THU(1), WEN, THI, FRI, SAT; private WeekDay() { System.out.println("First"); } private WeekDay(int day) { System.out.println("Second"); } } // 交通灯枚举实例 public enum TrrificLamp { RED(30) { @Override public TrrificLamp nextLamp() { return GREEN; } }, GREEN(45) { @Override public TrrificLamp nextLamp() { return YELLOW; } }, YELLOW(5) { @Override public TrrificLamp nextLamp() { return RED; } }; public abstract TrrificLamp nextLamp(); private int time; //枚举构造器私有 private TrrificLamp(int time) { this.time = time; } } }