注解

1、预定义注解

@Override: 当方法使用该注解时,表示该方法是一个重写的方法,那么该方法必须符合重写的规则【子类重写的方法名必须和父类的方法名一致,参数也要一致,返回值也要一致 访问修饰不能小于父类的<public protected 默认 private> 抛出的异常不能大于父类】。

@Deprecated: 标记该方法已经过时。JVM

@FuncationInterface: 函数式接口.---要求接口钟有且仅有一个抽象方法

 2、自定义注解

语法:

public @interface 注解名{

}

 

如何使用:

public class PateTxt {
    public static void main(String[] args) {
        q q = new q();
        q.show("ssss");

    }
}
    @interface BH{
   }
   @BH
   //类
    class q{
        //属性
        @BH
       private String name;
        @BH
        //方法
       public void show(String n){
            System.out.println("==="+n);
        }
   }

使用了自定义注解并没有任何意思,要想让他有意义,必须结合后反射来解析这些注解,并赋予相应的作用。

@Override:----JVM解析了该注解

@Controller:---spring框架解析了该注解。

3、元注解

思考: @Controller只能使用在类上。 @GetMapping只能使用在方法。为什么这些注解可以限制它的使用范围。因为它们用来元注解来限制。

@Retention: 限制注解什么时候生效。【源码---javac---字节码----运行】

 //源码时生效
 SOURCE,

 //字节码时生效
 CLASS,

 //运行时生效。反射。
 RUNTIME

 @Target: 该注解可以使用在哪些地方

 //使用在类上
 TYPE,

 //使用在属性上
 FIELD,

 //使用在方法上
 METHOD,

 //使用在参数
 PARAMETER,

 //使用在构造方法上
 CONSTRUCTOR
 //元注解
    /**
     * TYPE  --作用在类上
     * METHOD --作用在方法上
     * FIELD --作用属性上
     * PACKAGE --作用在参数是按
     * CONSTRUCTOR --作用在构造方法上
     */
    @Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PACKAGE,ElementType.CONSTRUCTOR})
    /**
     * SOURCE --源码时生效
     *  CLASS --字节码时生效
     *  RUNTIME --运行时生效
     */
    @Retention(value = RetentionPolicy.RUNTIME)
   //自定义注解
    @interface BH{

   }
   @BH
   //类
    class q{
        //属性
        @BH
       private String name;
        @BH
        //方法
       public void show(String n){
            System.out.println("==="+n);
        }
   }

@Documented: 在生成api文档是是否含有该注解。

4 自定义注解--【属性】

思考: @GetMaping(value="/info") 这里的value它就是注解钟的属性。

语法:

public @interface 注解名{

数据类型 属性名() default 默认值;

//如果没有设置默认值,那么在使用该注解时必须为该属性指定值。

}

数据类型可以用哪些类型: 基本类型[8个] 字符串类型 上面这些类型的数组

 //元注解
 /**
  * TYPE  --作用在类上
  * METHOD --作用在方法上
  * FIELD --作用属性上
  * PACKAGE --作用在参数是按
  * CONSTRUCTOR --作用在构造方法上
  * BH注解只能使用在类和方法上,默认可以在任何位置使用
  */
 @Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PACKAGE,ElementType.CONSTRUCTOR})
 /**
  * SOURCE --源码时生效
  *  CLASS --字节码时生效
  *  RUNTIME --运行时生效
  *  运行有效这个使用的最多
  *  SOURCE > CLASS > RUNTIME 默认在字节码生效
  */
 
 @Retention(value = RetentionPolicy.RUNTIME)
//自定义注解
 @interface BH{
 String value() default "";
 int age() default 18;
 String[] hobby() default {};
 
}
@BH(value = "Hello")
//类
 class q{
     //属性
     @BH
    private String name;
     @BH
     //方法
    public void show(String n){
         System.out.println("==="+n);
     }
}

 

posted @ 2023-08-10 10:18  PHOEDE  阅读(55)  评论(0)    收藏  举报