1.本章目标:
基本的Annotation
自定义的Annotation
为注解添加属性
元注解
会提取注解信息
2.基本的Annotation
使用 Annotation 时要在其前面增加 @ 符号, 并把该 Annotation 当成一个修饰符使用. 用于修饰它支持的程序元素
三个基本的 Annotation:
@Override: 限定重写父类方法, 该注释只能用于方法
@Deprecated: 用于表示某个程序元素(类, 方法等)已过时
@SuppressWarnings: 抑制编译器警告.
3.自定义Annotation
定义新的 Annotation 类型使用 @interface 关键字
Annotation 的成员变量在 Annotation 定义中以无参数方法的形式来声明. 其方法名和返回值定义了该成员的名字和类型.
可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用 default 关键字
没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数据 Annotation
4.为注解增加基本属性
1> 什么是注解的属性?
一个注解相当于一个胸牌,如果你胸前贴了胸牌,就是XX学校的学生,否则,就不是。
如果还想区分出是XX学校的哪个班的学生,这时候可以为胸牌在增加一个属性来进行区分。
加了属性的标记效果为:@MyAnnotation(color="red")
2> 定义基本类型的属性和应用属性: 在注解类中增加String color(); @MyAnnotation(color="red")
3> 用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法
MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class);
System.out.println(a.color());
可以认为上面这个@MyAnnotation是MyAnnotaion类的一个实例对象
5.代码展示
@Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD}) public @interface MyAnnotation { //定义String类型的成员变量(属性)color String color() default "hello"; //定义int类型的属性x int x() default 0; //定义String类型的属性value String value(); //定义数组类型的属性 int[] ary() default {1,2,3}; //定义枚举类型的属性sex Sex sex(); //定义newanno的属性,类型是NewerAnnotation NewerAnnotation newanno() default @NewerAnnotation("xxxxx");
public static void main(String[] args) { // 读取加在类上的注解 read1(); // 读取加在字段上的注解 read2(); // 读取加在方法上的注解 read3(); } private static void read3() { Class clz = Person.class; try { Method method = clz.getMethod("fun"); if (method.isAnnotationPresent(MyAnnotation.class)) { MyAnnotation myanno = (MyAnnotation) method .getAnnotation(MyAnnotation.class); } } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static void read2() { Class clz = Person.class; try { Field field = clz.getDeclaredField("name"); if (field.isAnnotationPresent(MyAnnotation.class)) { MyAnnotation myanno = (MyAnnotation) field .getAnnotation(MyAnnotation.class); } } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static void read1() { Class clz = Person.class; // 判断Person类上是否有MyAnnotation注解 if (clz.isAnnotationPresent(MyAnnotation.class)) { // 得到加在Person类的MyAnnotation注解 MyAnnotation myanno = (MyAnnotation) clz .getAnnotation(MyAnnotation.class); System.out.println("value=" + myanno.value()); System.out.println("x=" + myanno.x()); System.out.println("ary=" + Arrays.toString(myanno.ary())); System.out.println("newanno=" + myanno.newanno().value()); } }
6.总结与心得
忍耐是坚忍和能耐的简称;学问是苦学和勤问的概括。最快的脚步不是跨越,而是继续;最慢的步伐不是小步,而是徘徊。
有超乎常人的毅力,必有超乎常人的抱负。如果惧怕前面跌宕的山岩,生命就永远只能是死水一潭。生活在于经历,而不在于名牌。