美文网首页
JDK5-注解

JDK5-注解

作者: Josaber | 来源:发表于2017-01-09 22:37 被阅读0次

    注解是一个类,一个声明就是一个对象

    简单注解

    @SuppressWarnings("msg") - 压缩/抑制警告
    @Deprecated - 声明过时
    @Override - 声明复写

    自定义注解

    public @interface Anno {
    }
    

    注解的使用

    @Anno
    public class AnnoTest {
        public static void main(String[] args) {
            if(AnnoTest.class.isAnnotationPresent(Anno.class)) {
                Anno anno = (Anno)AnnoTest.class.getAnnotation(Anno.class);
                ...
            }
        }
    }
    

    但是在这里我们发现:无法获取到Anno的实例,是因为Anno注解在加载进内存时被去除了

    注解的生命周期
    源文件:RetentionPolicy.SOURCE(如SuppressWarnings及Override)
    class文件:RetentionPolicy.CLASS(默认
    内存字节码:RetentionPolicy.RUNTIME(如Deprecated)

    重定义注解

    @Retention(RetentionPolicy.RUNTIME)
    public @interface Anno {
    }
    

    元注解

    元注解:对注解进行注解的注解(@Retention、@Target、@Documented和@Inherited)-> java.lang.annotation

    @Retention:设置注解的可见性(生命周期)
    @Target:设置注解的作用目标
    @Documented:指示javadoc应该为注解生成文档
    @Inherited:指示在子类继承父类时继承本注解

    注解的作用范围

    Target元注解:@Target(ElementType[])

    如:
    @Target({ElementType.TYPE, ElementType.METHOD})
    @Target(ElementType.TYPE)  // 一个元素可以省略{}

    ElementType

    TYPE:所有元素(类、接口、枚举...)
    PARAMETER:参数
    PACKAGE:包
    METHOD:方法
    LOCAL_VARIABLE:局部变量
    FIELD:属性
    CONSTRUCTOR:构造器
    ANNOTATION_TYPE:注解

    为注解加属性(方法)

    注解中属性的类型:八种基本类型、String、Class(ClassName.class)、enum以及上述类型的数组

    @Retention(RetentionPolicy.RUNTIME)
    public @interface Anno {
        String color();
    }
    
    @Anno(color="red")
    public class AnnoTest {
        public static void main(String[] args) {
            if(AnnoTest.class.isAnnotationPresent(Anno.class)) {
                Anno anno = (Anno)AnnoTest.class.getAnnotation(Anno.class);
                System.out.println(anno.color());
            }
        }
    }
    

    为注解属性添加默认值

    若注解内只有一个属性且名为value或除value外其他属性均有默认值时,赋值时可以省略value,如下:

    @Retention(RetentionPolicy.RUNTIME)
    public @interface Anno {
        String value();
    }
    
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Anno2 {
        String color() default "red";// 为属性设置默认值
        String value();
        int[] array() default {1, 2, 3};
        Anno annotation() default @Anno("Joshua");    // 注解中属性为注解
    }
    
    @Anno("Joshua")
    @Anno2("Joshuaber")
    public class AnnoTest {
        public static void main(String[] args) {
            if(AnnoTest.class.isAnnotationPresent(Anno.class)) {
                Anno anno = (Anno)AnnoTest.class.getAnnotation(Anno.class);
                System.out.println(anno.value());
            }
        }
    }
    

    Anno2也可也这样引用:@Anno2(color="blue", value="Joshua", array=1)

    相关文章

      网友评论

          本文标题:JDK5-注解

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