• JDK5.0新特性3


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

    忍耐是坚忍和能耐的简称;学问是苦学和勤问的概括。最快的脚步不是跨越,而是继续;最慢的步伐不是小步,而是徘徊。
    有超乎常人的毅力,必有超乎常人的抱负。如果惧怕前面跌宕的山岩,生命就永远只能是死水一潭。生活在于经历,而不在于名牌。
  • 相关阅读:
    Json数据解析
    Fragment
    android dom解析相关理解
    数据解析--sax解析
    android pull解析相关理解
    Android-通过URL获取网络资源
    HttpURLConnection
    Android平台关于时间和日期的相关类和方法(Date/Time)
    Asynctask onPostExecute未执行的问题分析
    windows下构建发布python模块(转载)
  • 原文地址:https://www.cnblogs.com/www-tty-com/p/13603159.html
Copyright © 2020-2023  润新知