小白学注解

看视频跟着写点笔记

注解

jdk1.5后的特性,主要运用在框架中,替换繁琐的配置文件

  1. JDK中预定义的一些注解

    • @Override: 检测被该注解标注的方法是否继承父类(接口)
    • @Deprecated:该注解标注的内容表示已过时
    • @SuppressWarnings:压制警告
      • 一般传递参数all @SuppressWarnings("all)表示压制所有警告
    @SuppressWarnings("all")    //压制所有警告
    public class AnnotationDemo {
        @Override
        public String toString() {
            return super.toString();
        }
    
        @Deprecated     //设置test方法已过时
        public void test() {}
    
        public void test2(){
        }
    
    }
    
  2. 自定义注解

    • 格式

      ​ 元注解

      ​ public @interface 注解名称{

      ​ 属性列表

      ​ }

    • 本质:注解本质上就是一个接口,该接口默认继承Annotation接口

      • 通过反编译可以看到源代码

在这里插入图片描述
进行反编译:

  • 属性:接口中的抽象方法

    • 要求:

      1. 属性的返回值类型有下列取值

        • 基本数据类型

        • String

        • 枚举

        • 注解

        • 以上类型的数组

          public @interface MyAnnotation {
              int method1();
              String method2();
              EnumDemo method3();
              MyAnnotation2 method4();
              int[] method5();
          }
          
          
      2. 定义了属性,使用注解时必须给属性赋值

        1. 如果定义属性时,使用default关键字给属性设置默认初始化值,则使用注解时可以不用赋值
        2. 如果只有一个属性需要赋值,并且属性的名称是value时,则value可以省略,直接定义值即可.
        3. 数组赋值时,值使用{}包裹.如果数组中只有一个值,则{}可以省略
  • 元注解:用于描述注解的注解

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

      • ElementType取值:
        • TYPE:可以作用在类上
        • METHOD: 可以作用于方法上
        • FIELD:可以作用于成员变量上
    • @Retention: 描述注解被保留的阶段

      • @Retention(RetentionPolicy.RUNTIME) : 当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
    • @Documented: 描述注解是否被抽取到api文档中

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

  • 在程序中使用注解:获取注解定义的属性值

    1. 获取注解定义的位置的对象 (Class, Method,Field)
    2. 获取指定的注解
      • getAnnotation(Class)
  1. 调用注解中的抽象方法获取配置的属性值

    @MyAnnotation2(className = "com.pretext.reflect.Person", methodName = "eat")
    public class AnnoTest {
        public static void main(String[] args) throws Exception{
            Class<AnnoTest> clazz = AnnoTest.class;
            MyAnnotation2 annotation = clazz.getAnnotation(MyAnnotation2.class);
            /*
                实际上相当于在内存中生成了一个类实现了该注解的类
                public MyAnnotation2Impl implements MyAnnotation2 {
                    public String className(){
                         return "com.pretext.annotation.MyAnnotation2;
                    }
             */
            System.out.println(annotation.className());
            System.out.println(annotation.methodName());
            Class<?> aClass = Class.forName(annotation.className());
            Person person = (Person) aClass.newInstance();
            Method method = aClass.getMethod(annotation.methodName());
            method.invoke(person);
        }
    }
    

    查看spring框架中的注解,加深理解

    RequestMapping注解

	
@Target({ElementType.METHOD, ElementType.TYPE})	//元注解可已在方法,类中添加
@Retention(RetentionPolicy.RUNTIME)			  //表示保留到class上,并在JVM中加载
@Documented								//提取文档时保留注解
@Mapping								//没发现作用,里面只有元注解的出现
public @interface RequestMapping {		//属性都设置的默认值,因此单独写path时没有写属性名
    String name() default "";				
    
    @AliasFor("path")				//为注解取别名,与下面的value相对应,防止同时出现程序发生异常
    String[] value() default {};

    @AliasFor("value")
    String[] path() default {};

    RequestMethod[] method() default {};

    String[] params() default {};

    String[] headers() default {};

    String[] consumes() default {};

    String[] produces() default {};
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值