码迷,mamicode.com
首页 > 其他好文 > 详细

JDK5.0新特性3

时间:2020-09-16 12:13:47      阅读:34      评论:0      收藏:0      [点我收藏+]

标签:def   程序   编译器   xxxxx   warning   没有   元注解   成员变量   generate   

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.总结与心得

忍耐是坚忍和能耐的简称;学问是苦学和勤问的概括。最快的脚步不是跨越,而是继续;最慢的步伐不是小步,而是徘徊。
有超乎常人的毅力,必有超乎常人的抱负。如果惧怕前面跌宕的山岩,生命就永远只能是死水一潭。生活在于经历,而不在于名牌。

 

JDK5.0新特性3

标签:def   程序   编译器   xxxxx   warning   没有   元注解   成员变量   generate   

原文地址:https://www.cnblogs.com/www-tty-com/p/13603159.html

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