美文网首页
java 中的注解

java 中的注解

作者: sunjiandev | 来源:发表于2019-11-07 20:32 被阅读0次

    java 中的注解

    使用的时候可以参考秒懂,Java 注解 (Annotation)你可以这样学

    Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。

    元注解

    元注解是可以注解到注解上的注解,或者说元注解是一种基本注解,但是它能够应用到其它的注解上面。

    源注解的类型包括以下几种:

    • @Retention 指定注解的存活周期
      • RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
      • RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
      • RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
    • @Documented 它的作用是能够将注解中的元素包含到 Javadoc 中去。
    • @Target 指定了注解运用的地方
      • ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
      • ElementType.CONSTRUCTOR 可以给构造方法进行注解
      • ElementType.FIELD 可以给属性进行注解
      • ElementType.LOCAL_VARIABLE 可以给局部变量进行注解
      • ElementType.METHOD 可以给方法进行注解
      • ElementType.PACKAGE 可以给一个包进行注解
      • ElementType.PARAMETER 可以给一个方法内的参数进行注解
      • ElementType.TYPE 可以给一个类型进行注解,比如类、接口、枚举
    • @Inherited 如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解,举例如下:
    @Inherited
    @Retention(RetentionPolicy.RUNTIME)
    @interface Test {}
    
    @Test
    public class A {}
    
    public class B extends A {}
    
    

    注解 Test 被 @Inherited 修饰,之后类 A 被 Test 注解,类 B 继承 A,类 B 也拥有 Test 这个注解。

    • @Repeatable 可重复使用的注解,使用如下:
    
    @interface Persons {
        Person[]  value();
    }
    
    
    @Repeatable(Persons.class)
    @interface Person{
        String role default "";
    }
    
    
    @Person(role="artist")
    @Person(role="coder")
    @Person(role="PM")
    public class SuperMan{
        
    }
    
    

    @Repeatable 注解了 Person。而 @Repeatable 后面括号中的类相当于一个容器注解。什么是容器注解呢?就是用来存放其它注解的地方。它本身也是一个注解。看看代码中的相关容器注解:

    @interface Persons {
        Person[]  value();
    }
    

    按照规定,它里面必须要有一个 value 的属性,属性类型是一个被 @Repeatable 注解过的注解数组,注意它是数组。

    注解的使用

    • 定义一个注解
    //定义一个属性的注解
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface FruitName {
        String value() default "";
    }
    
    ...
    
    @Target(ElementType.FIELD)
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    public @interface FruitColor {
        enum Color {RED, GREEN, BLUE}
    
        Color value() default Color.RED;
    }
    
    ...
    
    @Target(ElementType.FIELD)
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    public @interface FruitProvider {
        int id() default -1;
    
        String name() default "";
    
        String address() default "";
    }
    
    注解定义好了,开始使用:
    
    /**
     * 注解使用
     */
    public class Apple {
    
        @FruitName("Apple")
        private String appleName;
    
        @FruitColor(value= FruitColor.Color.RED)
        private String appleColor;
    
        @FruitProvider(id=1,name="山西",address="山西五台山五台县")
        private String appleProvider;
        
    }
    
    ...
    
    public static void getFruitInfo(Class<?> clazz){
    
            String strFruitName=" 水果名称:";
            String strFruitColor=" 水果颜色:";
            String strFruitProvicer="供应商信息:";
    
            Field[] fields = clazz.getDeclaredFields();//获取属性注解的集合
    
            for(Field field :fields){
            //判断是否是某一个注解
                if(field.isAnnotationPresent(FruitName.class)){
                //获取注解的实例
                    FruitName fruitName =  field.getAnnotation(FruitName.class);
                    //获取注解的属性strFruitName=strFruitName+fruitName.value();
                    System.out.println(strFruitName);
                }
                else if(field.isAnnotationPresent(FruitColor.class)){
                    FruitColor fruitColor= field.getAnnotation(FruitColor.class);
                    strFruitColor=strFruitColor+fruitColor.value().toString();
                    System.out.println(strFruitColor);
                }
                else if(field.isAnnotationPresent(FruitProvider.class)){
                    FruitProvider fruitProvider=  field.getAnnotation(FruitProvider.class);
                    strFruitProvicer=" 供应商编号:"+fruitProvider.id()+" 供应商名称:"+fruitProvider.name()+" 供应商地址:"+fruitProvider.address();
                    System.out.println(strFruitProvicer);
                }
            }
        }
    
    

    相关文章

      网友评论

          本文标题:java 中的注解

          本文链接:https://www.haomeiwen.com/subject/cjqbbctx.html