Java注解

Java注解

1.注解的用处

  1. 编写文档:通过java doc命令生成doc文档 如@Since@Param

  2. 代码分析:

  3. 编译检查:比如@Override注解

 

2.JDK中自定义的注解

  • @Override :检测被该注解标出的方法是否是继承自父类或者父接口

    安全检查: 防止在想要重写的时候因为 参数和方法名不正确等细节问题 而造成的重写失败

  • @Deprecated : 内容已过时

  • @SuppressWarnings : 设置警告的等级

3.自定义注解

注解的格式为 注解 + public @interface RestController {}

如果是JDK自带的注解 :那么他的格式是:元注解 + public @interface xxx{}

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
   @AliasFor(
       annotation = Controller.class
  )
   String value() default "";
}

经过javap命令,对java字节码文件进行反编译;

 

注解

public @interface MyAnno{}

会变成

public interface MyAnno extends java.lang.annotation.Annotation{}

所以注解本质上就是一个接口;它继承了 java.lang.annotation.Annotation 这样一个接口,Annotation是所有注解类型的父接口,但是他Annotation的扩展并不一定是注解类型;而且Annotaion它自己本身不是注解类型,而是一个简单的接口

接口中可以定义成员属性,所以注解的内部也可以定义属性,但是注解类型对于内部方法的返回值有要求

要求一:

  • 基本类型

  • String

  • 枚举

  • 注解

  • 以上类型的数组

要求二:如果定义了属性,那么在使用该注解的时候需要给其属性进行赋值,赋值的类型就是方法的返回值类型 (如果在属性后面加上default “allen”,那么在使用注解的时候可以不赋值【简言之:属性要么给他赋值,要么使用默认值】)

要求三:如果注解只有一个属性值,并且属性名为value,那么在赋值时可以省略属性名【比如@SuppressWarnings("all")

要求四:数组类型的属性赋值不是中括号而是大括号(数组成员只有一个时,可以省略大括号)

 

 

4.元注解

用来标注注解的元注解

  • @Target : 描述注解能够作用的位置

    • ElementType(枚举类型)取值

      • TYPE :本注解只能作用在类上

      • METHOD : 本注解只能作用在方法上

      • FILED : 本注解只能作用在成员变量 上

  • @Retention : 描述注解被保留的阶段

    • value

      • SOURCE :

      • CLASS :

      • RUNTIME : 本注解会保留到class文件中,并被JVM读取到

  • @Documented : 描述注解是否被抽取到doc文件中

    • doc文档中会不会显示注解(只有一个value,默认为true)

  • @Inherited : 描述注解是否被子类继承

    • 本注解会自动被子注解继承(只有一个value,默认为true)

5.如何使用注解?

因为注解本身相当于一个只有字段的接口;

  1. 先获得被注解标注的对象,(这个对象可以时Class对象、Method对象和Field对象,对应的时注解标注的位置)

  2. 从上面这个对象使用 getAnnotation()方法,返回一个注解接口的实现类

  3. 调用第二部获得的实现类的抽象方法来获取配置的属性值

  4.  

 

posted @ 2022-07-25 23:08  熊我  阅读(28)  评论(0)    收藏  举报