java 注解总结

作者: WarpTens | 来源:发表于2016-06-18 12:27 被阅读1343次

    Java注解 又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据。

    Java语言中的类、方法、变量、参数和包等都可以被标注。Java标注和Javadoc不同,标注有自反性。在编译器生成类文件时,标注可以被嵌入到字节码中,由Java虚拟机执行时获取到标注[。

    我们在平常编写代码的时候就用到了几个常用的系统注解 @Override @Deprecated SuppressWarnnings

    Annotation 注解 就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadata)的途径和方法。
    Annotation 不能影响程序代码的执行,无论增加、删除 Annotation,代码都始终如一执行

    注解的分类:

    根据注解参数的个数分类

    1. 标记注解:没有成员的注解称为标记注解,通过是否存在该注解可以获得相关信息,比如最熟悉的 @Override 注解
    2. 单值注解
    3. 完整注解

    根据注解使用方法和用途分类

    1. JDK 内置系统注解
    2. 元注解 用来修饰注解的注解
    3. 自定义注解

    系统注解

    @Override

    限定重写父类方法,,它被用作标注方法。它说明了被标注的方法重载了父类的方法,如果注解的方法没有重写父类方法,则会在编译时报错

    @Deprecated

    标记已过时,如果用此注解修饰的元素,编译器将不鼓励使用该注解

    SuppressWarnnings

    抑制编译器警告,被用于有选择的关闭编译器对类、方法、成员变量、变量初始化的警告

    常见参数值:

    1. deprecation:使用了不赞成使用的类或方法时的警告;
    2. unchecked:执行了未检查的转换时的警告,例如当使用集合时没有用泛型 (Generics) 来指定集合保存的类型;
    3. fallthrough:当 Switch 程序块直接通往下一种情况而没有 Break 时的警告;
    4. path:在类路径、源文件路径等中有不存在的路径时的警告;
    5. serial:当在可序列化的类上缺少 serialVersionUID 定义时的警告;
    6. finally:任何 finally 子句不能正常完成时的警告;
    7. all:关于以上所有情况的警告。

    用例:

    
        class Student
        {
            @SuppressWarnings(value = {"rawtype","unchecked"})
            void print1(){
    
            }
            @SuppressWarnings( {"rawtype","unchecked"})
            void  print2(){
    
            }
            @SuppressWarnings("unused")
            void  print3(){
                
            }
    
        }
    
    

    元注解:

    元注解的作用就是用来注解其它注解,主要有四种元注解

    1. @Target,
    2. @Retention,
    3. @Documented,
    4. @Inherited

    @Target:

    注明了注解修饰的对象的类型:

    取值(枚举类型 ElementType)有:

    1. CONSTRUCTOR: 修饰构造器
    2. FIELD:修饰域
    3. LOCAL_VARIABLE:修饰局部变量
    4. METHOD:修饰方法
    5. PACKAGE:修饰包
    6. PARAMETER:修饰参数
    7. TYPE:修饰类、接口(包括注解类型) 或enum声明
    
        @Target(ElementType.TYPE)
        public @interface  MyAnnonation {
            
        }
        @MyAnnonation
        class  Aa{
            
        }
    
    

    @Retention:

    @Retention 定义了该Annotation被保留的时间长短

    取值(RetentionPoicy)有:

    1. SOURCE: 源文件有效
    2. CLASS: class文件中有效
    3. RUNTIME: 运行时有效
      @Target(ElementType.FIELD)
        @Retention(RetentionPolicy.RUNTIME)
        public @interface  MyAnnonation {
    
        }
        class  Aa{
            @MyAnnonation
            String name;
        }
    
    

    @Documented:

    用于描述其它类型的Annotation应该被作为被标注的程序成员的公共API

    @Inherited

    阐述了某个被标注的类型是被继承的。

    如果一个使用了 @Inherited 修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

    注意:@Inherited annotation类型是被标注过的class的子类所继承。类并不从它所实现的接口继承annotation,方法并不从它所重载的方法继承annotation。

    1.如果子类继承父类,并且重写了父类中的带有注解的方法,那么父类方法上的注解是不会被子类继承的。
    2.如果子类继承父类,但是没有重写父类中带有注解的方法,那么父类方法上的注解会被子类继承,就是说在子类中可以得到父类方法上的注解。

    即使在注解中没有 @Inherited 也会满足上面情况,但是如果该注解是用来修饰类的,则不满足。

    自定义注解

    使用 @interface 自定义注解时,自动继承了java.lang.annotation.Annotation接口,由编译程序自动完成其他细节。在定义注解时,不能继承其他的注解或接口。
    @interface 用来声明一个注解,其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值。

    定义注解格式:
    public @interface 注解名 {定义体}

    注解参数的可支持数据类型:

    1. 所有基本数据类型(int,float,boolean,byte,double,char,long,short)
    2. String类型
    3. Class类型
    4. enum类型
    5. Annotation类型
    6. 以上所有类型的数组

    对于注解中的参数,只能用public或默认(default)这两个访问权修饰.例如,String value();如果只有一个参数成员,最好把参数名称设为"value",

    注解默认值

    注解元素必须有确定的值,要么在定义注解的默认值中指定,要么在使用注解时指定,非基本类型的注解元素的值不可为null。

    获得注解值

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
     @interface  MyTypeAnnonation{
        String value()default "no";
    }
    @MyTypeAnnonation(value = "my")
    class  Fruit
    {
    
    }
    public class Demo {
    
        public static void main(String []args){
            Class cl=Fruit.class;
            Annotation annotations[]=cl.getAnnotations();
            for(Annotation i:annotations){
                if(i instanceof  MyTypeAnnonation){
                    MyTypeAnnonation annonation=(MyTypeAnnonation)i;
                    System.out.println(annonation.value());
                }
            }
            Annotation annotation=cl.getAnnotation(MyTypeAnnonation.class);
            MyTypeAnnonation myTypeAnnonation=(MyTypeAnnonation)annotation;
            System.out.println(myTypeAnnonation.value());
        }
    }
    
    

    相关文章

      网友评论

        本文标题:java 注解总结

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