java 注解

本文详细介绍了Java中的注解,包括其概念、类型(预定义、元注解和自定义),以及注解在生成文档、代码依赖跟踪和编译时检查等方面的应用,特别强调了Spring框架中的注解使用。同时讨论了如何通过反射利用自定义注解赋予实际意义。
摘要由CSDN通过智能技术生成

1.注解的概念

注释: 给人看的,便于阅读代码, 对代码的描述

注解(Annotation): 对代码的描述, 作为代码形式保留下来,

Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。

注释: 类似超市商品下面的标签, 描述商品 方便给顾客查看的

注解: 类似商品的条形码, 描述商品, 方便后期商品结算

注解的本质: 特殊的接口

声明注解: 创建了一个特殊接口

使用注解: @注解名(创建注解的一个对象)

注解的作用

1、生成文档。这是最常见的,也是java 最早提供的注解。常用的有@param @return 等

2、跟踪代码依赖性,实现替代配置文件功能。比如Spring的注入,未来java开发,将大量注解配置,具有很大用处; 后期学习框架大量使用, 基于注解的开发

3、在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出
 

注释: 给开发人员看的

单行注释: / /

多行注释: /**/

文档注释:在方法上 类  /**  */

2.注解:给程序的spring

@GetMapping

@RequesBody

@Controller

@Override 是给Jvm程序

2.注解的种类

1.预定义注解:JDK里面自带的一些注解.该注解由JVM解析,

比如

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


    访问修饰符也得一样,小于就或者没有就报错

    class F {
        public void show()throws Exception{
            System.out.println("父类的方法");
        }
    }
    class S extends F{
        @Override
        public void show() throws Exception {
            super.show();
        }
    }

    大于父类抛出的异常就报错

  • @Deprecated 已过时, 只是一个标志, 还是能够使用


     

    package com.demo.demo2;
    
    public class Demo1 {
        public static void main(String[] args) {
            S s=new S();
            s.show();
    
        }
    
        public <T>T fun(T a){
            System.out.println("==="+a);
            return a;
        }
    }
    
    class F {
        public void show()throws Exception{
            System.out.println("父类的方法");
        }
    }
    class S extends F{
        @Deprecated
        public void show() throws Exception {
            super.show();
        }
    }
    
  • 像Date里有提出与之对应的解决方案

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

 


 

3.元注解:定义在注解上的注解

jdk定义好这个注解的声明, 在注解上使用,

1.@Documented-注解是否将包含在JavaDoc中

一个简单的Annotations标记注解,表示是否将注解信息添加在javadoc文档中

2.@Retention –什么时候使用该注解

Retention 的英文意为保留期的意思。

当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的的存活时间

它的取值如下:

 RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。

 RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。

 RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。
自定义注解: 保留期一定设置为runtime

 3.@Target–注解用于什么地方

默认值为任何元素,表示该注解用于什么地方。可用的ElementType参数包括 ● ElementType.CONSTRUCTOR:用于描述构造器

● ElementType.FIELD:成员变量、对象、属性(包括enum实例)

● ElementType.LOCAL_VARIABLE:用于描述局部变量

● ElementType.METHOD:用于描述方法

● ElementType.PACKAGE:用于描述包

● ElementType.PARAMETER:用于描述参数

● ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明

4.@Inherited – 定义该注释和子类的关系

Inherited 是继承的意思,但是它并不是说注解本身可以继承,而是说如果一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解

 多个的时候需要{ }


//自定义注解
@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})//My注解只能使用在类和方法上默认可以在任何位置使用,当加多个的时候,需要{}
@interface My{

}

@My //使用注解
class Hello{
    @My //使用注解
    private String name;
    @My //使用注解
    public void show(@My String a){//使用注解
        System.out.println("============="+a);
    }

//自定义注解
@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})//My注解只能使用在类和方法上默认可以在任何位置使用,当加多个的时候,需要{}
@Retention(value = RetentionPolicy.RUNTIME )//这个使用最多,运行有效
@interface My{

}

举例: @GetMaping(value="/info") 这里的value它就是注解中的属性。

语法:

public @interface 注解名{

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

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

}

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

package com.demo.a2_zhujie;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public class Demo2 {
    public static void main(String[] args) {
      Hello h=new Hello();
      h.show("你好呀");
    }
}

//自定义注解
@Target(value = {ElementType.TYPE,ElementType.METHOD,ElementType.FIELD,ElementType.PARAMETER})//My注解只能使用在类和方法上默认可以在任何位置使用,当加多个的时候,需要{}
@Retention(value = RetentionPolicy.RUNTIME )//这个使用最多,运行有效 Source--->Class--->Runtime 默认在字节码生效
@interface My{
    String value() default "";
    int age() default 18;
    String[] hobby() default {};
}

//如果只为value赋值,那么可以省略value属性名
@My(value = "hello") //使用注解
class Hello{
    @My //使用注解
    private String name;
    @My //使用注解
    public void show(@My String a){//使用注解
        System.out.println("============="+a);
    }
}

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

package com.demo.demo2;

public class Demo2 {
    public static void main(String[] args) {
      Hello h=new Hello();
      h.show("你好呀");
    }
}

//自定义注解
@interface My{

}

@My //使用注解
class Hello{
    @My //使用注解
    private String name;
    @My //使用注解
    public void show(@My String a){//使用注解
        System.out.println("============="+a);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值