java注解 -- java自带的注解

一、作用在代码中的注解

        1、@Override

                只能标注方法,表示该方法覆盖父类中的方法。

                若某个方法被@Override标注,则意味着该方法会覆盖父类中的同名方法。如果有方法被@Override标识,但父类中却没有“被@Override标注的”同名方法,则编译器会报错,该方法会爆红。

        2、@Deprecated

                所标注内容,不再建议使用。

 

        3、@SuppressWarnings

                使编译器对于“它所标注的内容”的某些警告保持静默

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
    String[] value();//有参数
}

                 例如:@SuppressWarnings(value={"deprecation"})是指对所标注内容中的“不再建议使用”保持沉默。

                value的可选值:

                        deprecation:使用了不再建议使用的类或方法时的警告。

                        unchecked:执行了未检查的转换时的警告,例如当使用集合时没有指定泛型。

                         fallthrough:当Switch程序块中共没有break时的警告。

                        path:在类路径、源文件路径等中有不存在的路径时的警告。

                        serial:在可序列化的类上缺少serialVersionUID定义时的警告。

                        finally:任何finally子句不能正常完成时的警告。

                        all:关于以上所有情况的警告 

二、作用在其他注解中的注解

        1、@Retention

                指定该注解的RetentionPolicy属性

                例如:@Retention(RetentionPolicy.RUNTIME)的意思就是指定该注解的策略是RetentionPolicy.RUNTIME,即编译器会将该主链接的信息保留在.class文件中,并且能被虚拟机读取。

                SOURCE:Annotation信息仅存在于编译器处理期间,编译器处理完成之后就没有该Annotation信息了。

                CLASS:编译器将Annotation存储于类对应的.class文件中(默认值)。

                RUNTIME:编译器将Annotation存储于class文件中,并且可由JVm读入。

        2、@Documented

                该注解是否会出现在用户文档中(有该注解则可以出现在用户文档中,反之不会)。

                类和方法的注解在缺省情况下是不出现的用户文档中的,如果使用@Documented修饰该Annotation,则表示它可以出现在用户文档中。

        3、@Target

                指定这个注解的ElementType属性(可多选)

                @Target(ElementType.TYPE)的意思就是指定该Annotation的类型是ElementType.TYPE

                定义注解时,@Target可有可无;若有@Target,则该注解只能用于它所指定的地方,若没有@Target,则该注解可以用于任何地方。               

        TYPE:类、接口(包括注释类型)、枚举声明

        FIELD:字段声明

        METHOD:方法

        PARAMETER:参数

        CONSTRUCTOR:构造方法

        LOCAL_VarIABLE:局部变量

        ANNOTATION_TYPE:注释类型

        PACKAGE:包

        4、@Inherited

                标记该注解将具有继承性。

     父类的类上和方法上有自定义的注解,子类继承了这个父类:

编写自定义注解时使用@Inherited 编写自定义注解时使用@Inherited
子类的类上能否继承到父类的类上的注解?
子类方法实现了父类上的抽象方法,这个方法能否继承到注解?

子类方法继承了父类上的方法,这个方法能否继承到注解?
子类方法,覆盖了父类上的方法,这个方法能否继承到注解?

        总结

        @Inherited只可控制类名上的注解是否可以被继承,无法控制方法上的注解能否被继承。

        1、父类类上的注解,只有被标注了@Inherited元注解后才可被子类继承。

        2、父类某个方法上有注解(不论这个注解是否使用了@Inherited),方法被继承后,只要不重写,那么也相当于这个注解被继承(最终调用的还是父类的方法),而如果子类重写了父类的方法之后,注解不会生效(子类重写了父类的方法后,调用的是子类自身的方法)。

                

                

本文参考了以下几篇文章:

1.​​​​​​子类上是否可以继承父类的注解_我叫周利东的博客-CSDN博客_子类继承父类的注解

2. Java 注解(Annotation) | 菜鸟教程

猜你喜欢

转载自blog.csdn.net/YMYYZ/article/details/128775255