注解

作者: 鉴闻俗说 | 来源:发表于2017-12-05 10:38 被阅读0次

    一、 Annotation的工作方式

    Annotation并不会直接影响程序的语义,它的工作方式类似于程序的类库或者工具,它反过来会对程序的语义有所影响。Annotation可以从源文件、class文件或者以运行时反射的多种方式被读取。

    二、 几个常用的注解

    1、Override注解表示子类要重写父类对应的方法。
    2、Deprecated注解表示方法不建议被使用;
    3、SurpressWarnings注解表示一直警告。
    4 、Retentoion注解用于在定义主解时修饰注解该如何读取。在使用时必须搭配属性value,value的取值是一个RetentionPolicy枚举类型:

    @Retention(RetentionPolicy.RUNTIME) //表示在运行时反射获取Annotation
    //@Retention(RetentionPolicy.CLASS) //表示从class文件获取Annotation
    //@Retention(RetentionPolicy.SOURCE) //表示从源文件获取Annotation
    

    5 、Target注解用于在定义主解时限定注解的使用位置。在使用时也必须搭配属性value,value的去值是一个ElementType枚举类型:

    //不同的枚举类型表示该注解只能作用的位置
    @Target(value = ElementType.METHOD)
    //@Target(value = ElementType.ANNOTATION_TYPE)
    //@Target(value = ElementType.CONSTRUCTOR)
    //@Target(value = ElementType.FIELD)
    //@Target(value = ElementType.LOCAL_VARIABLE)
    //@Target(value = ElementType.PACKAGE)
    //@Target(value = ElementType.PARAMETER)
    //@Target(value = ElementType.TYPE)
    //@Target(value = ElementType.TYPE_PARAMETER)
    //@Target(value = ElementType.TYPE_USE)
    

    三、 自定义注解

    1、自定义注解时,当注解的属性名时value时,对其赋值时可以不指定属性名称直接写上属性值即可;除了value之外其他的属性都必须以name = value的方式赋值。
    2、Demo

    (1) 自定义的注解

    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    
    @Retention(RetentionPolicy.RUNTIME) //表示在运行时反射获取Annotation
    //@Retention(RetentionPolicy.CLASS) //表示从class文件获取Annotation
    //@Retention(RetentionPolicy.SOURCE) //表示从源文件获取Annotation
    public @interface MyAnnotation
    {
        String hello() default "hello";
        String world();
        
    }
    

    (2)注解的使用

    public class MyTest
    {
        @MyAnnotation(hello = "tiangjin", world = "shanghai")
        @Deprecated
        @SuppressWarnings("unchecked")
        public void output()
        {
            System.out.println("output something!");
        }
    }
    

    (2)利用反射查看注解

    import java.lang.annotation.Annotation;
    import java.lang.reflect.Method;
    
    public class MyReflectTest
    {
        public static void main(String[] args) throws Exception
        {
            MyTest myTest = new MyTest();
            
            Class<?> c =myTest.getClass();
            Method method = c.getMethod("output", new Class[] {});
            
            if (method.isAnnotationPresent(MyAnnotation.class))
            {
                method.invoke(myTest, new Object[] {});
        
                MyAnnotation myAnnotation = method.getAnnotation(MyAnnotation.class);
                
                String hello = myAnnotation.hello();
                String world = myAnnotation.world();
                System.out.println(hello + " " + world);
            }
            
            
            Annotation[] annotations = method.getAnnotations();
            for(Annotation annotation : annotations)
                System.out.println(annotation.annotationType().getName());
        }
    }
    

    四、 注解的继承关系

    默认情况下,子类是不会继承父类中的Annotation的,如果想要继承父类中的某些Annotation,需要在在定义该Annotation形态时加上java.lang.Annoatation.Inherited形态的Annotation。

    上一篇: 动态代理模式
    下一篇:JUnit单元测试

    相关文章

      网友评论

          本文标题:注解

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