注解(了解注解)

文章详细介绍了Java中的注解,包括注解的作用,如给程序提供信息,以及注解的分类:预定义注解(如@Override、@Deprecated)、自定义注解和元注解(如@Target、@Retention)。还讨论了注解的使用规则,如方法重写和函数式接口,并举例说明了自定义注解及其属性的定义和使用。此外,提到了注解的解析,通常需要结合反射机制在运行时赋予注解实际功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注解

一、什么是注解

注释: 注释给开发人员开的。对你的代码加以解释,程序编译后该注释不可见。

注解: 注解给程序看,该注解编译后依然存在。

@Controller @RequestMapping() ---Spring程序看的。

@Override JVM虚拟机看。重写特点。方法名要和父类被重写的方法一致,参数列表要一致,

返回值要一致。访问修饰符不能小于父类访问修饰。抛出的异常不能大于父类异常。

如果注解不被解析,那么注解就没有任何意义。

二、注解的分类

1.预定义注解:----JDK自带的一些常用注解。
2.自定义注解-----我们自己定义的注解
3.元注解:------注解上使用的注解。

1.预定义注解

  1. @Override: 表示方法重写,只要使用了该注解必须符合重写的规则

  2. @Deprecated: 表示已过时。告诉调用者该方法已过时

  3. @SuppressWarnings: 表示压制警告。

  4. @FunctionInterface: 函数式接口注解。使用该注解表明接口中只能有一个抽象方法。

package org.example.demo06;
​
public class Test06 {
​
    public static void main(String[] args) {
        Son s=new Son();
        s.show();
        s.print();
​
    }
}
class Father{
    public void print(){
        System.out.println("这是father中的方法");
    }
}
​
class Son extends Father{
​
    @Override//检查该方法重写时是否符合重写规则
    public void print() {
        System.out.println("这是子类的方法");
    }
​
    @Deprecated //标记该方法过时,在调用该方法有个删除线
    public void show(){
​
    }
    public void showPrefect(){
​
    }
}
​
package org.example.demo03;
​
public class Test03 {
    public static void main(String[] args) {
​
    }
}
@FunctionalInterface //该接口中有且仅有一个抽象方法 1.8以后
interface Usb{
    public void show();
}
​

2.自定义注解

public @Interface 注解名{//
 //属性
}
package org.example.demo07;
​
public @interface My {
}
@My
class hello{
    @My
    public  void  show (@My int a ){
        
    }
    @My
    public String name;
    
    
}

自定义的注解默认对代码没有任务影响,如果想让注解有意义,必须解析该注解。我们后面可以结合反射,来解析这些注解。

@Controller注解是因为Spring框架解析了它 @Override JVM解析了它。

三、元注解

使用在注解上的注解就是元注解。

@Target: 作用: 告诉该注解使用的范围。默认所有

 TYPE,可以使用在类上
 FIELD,使用在属性上
 METHOD,使用方法上
 PARAMETER, 使用在方法参数上
 CONSTRUCTOR, 使用在构造方法上  

@Retention: 作用: 该注解什么时候有效。默认: SOURCE

SOURCE: 源码时有效
CLASS: 字节码时
RUNTIME: 运行时有效。【采用的最多】

@Documented: 作用: 在代码生成api文档时是否存在该注解,

 

四、自定义注解的高级

我们可以发现我们之前使用@GetMaping注解时可以有属性值。

@interface 注解名{

数据类型 属性名();

}

数据类型可以是哪些类型?

基本数据类型, 字符串类型,枚举类型,注解类型,以及上面这些类型的数组类型。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
 int age(); //基本类型
 String name();//字符串类型
 MyEnum address();//枚举
 My my();//注解类型
 int[] ages();
 String[] names();
 MyEnum[] addresss();
 My[] mys();
}

如果属性定义好后,在使用该注解是需要指定属性的值,

//如果属性为数组类型,给数组类型赋值时如果只有一个值那么可以省略{}
//如果该注解中只使用value属性,那么value属性名可以省略。
@MyAnnotation(age=15,name="张三",address = MyEnum.BEIJING,my=@My,ages={15,25,35},names="hello")

@My(value = "good",name="李四")
public class Student {

 public void show(){
     System.out.println("hello");
 }

}
​
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值