Java基础知识7-注解

注解概述

什么是注解?

①注解是JDK1.5才引入的。

②注解可以标注在 类上,属性上,方法上 等。

==③注解可以做到在不改变代码逻辑的前提下在代码中嵌入补充信息。==

注解与注释

①注释:给程序员看的,编译器编译时会忽略注释。

②注解:给编译器看的,或给其它程序看的,程序根据有没有这个注解来决定不同的处理方式。

注解的重要性

①框架是如何实现的:框架 = 反射 + 注解 + 设计模式。

Java预置注解

①@Deprecated

用来标记过时的元素,在编译阶段遇到这个注解时会发出提醒警告,告诉开发者正在调用一个过时的元素比如过时的类过时的方法、过时的属性等。

forRemoval属性值表示如果是true就是已移除

②@Override

修饰实例方法,则该方法必须是个重写方法,否则就会编译失败。

③@SuppressWarnings(抑制警告的注解):在实际开发中,建议尽量不要忽略警告,而是真正的去解决警告。

1
2
3
4
5
6
7
@SuppressWarnings("rawtypes"):抑制未使用泛型的警告

@SuppressWarnings("resource"):抑制未关闭资源的警告

@SuppressWarnings("deprecation"):抑制使用了已过时资源时的警告

@SuppressWarnings("all"):抑制所有警告

④@FunctionalInterface “函数式接口”的注解

**==“函数式接口”的注解,这个是 JDK1.8 版本引入的新特性。==**:函数式接口 有且只能存在一个抽象方法

==这个注解是专门用来标注接口的==

使用@FunctionalInterface标注的接口,则该接口就有且只能存在一个抽象方法,否则就会发生编译错误。

(注意:接口中的默认方法或静态方法可以有多个。)

image-20240304223802741

自定义注解Annotation

image-20240304223916674

注解的属性是以方法这种签名实现的

自定义注解(注解属于引用数据类型)

image-20240304223840432

①使用 @interface 来定义注解。

②默认情况下注解可以出现在类上、方法上、属性上、构造方法上、方法参数上等……

③所有自定义的注解,它的父类是:java.lang.annotation.Annotation

1
2
3
4
5
6
//@Retention(value= RetentionPolicy.SOURCE) // @MyAnnotation 注解保留在源码中。
//@Retention(value= RetentionPolicy.CLASS) // @MyAnnotation 注解保留在字节码中,这是默认的行为,但不能被反射。
//@Retention(value= RetentionPolicy.RUNTIME) // @MyAnnotation 注解保留在字节码中,并且在运行时可以被反射。
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation {
}
1
2
3
4
5
6
7
8
9
10
@MyAnnotation
public class Test {

@MyAnnotation
int num = 100;

@MyAnnotation
public static void main(String[] args) {

}

注解也可以定义属性

①注解也可以定义属性,不过属性定义时,属性名后面必须加一个小括号。

②属性的类型只能是:

byte,short,int,long,float,double,boolean,char

String、Class、枚举类型、注解类型

以上所有类型的一维数组形式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* 这是一个数据库信息的注解(自定义的注解)
*/
public @interface DataBaseInfo {
/**
* 注解也可以定义属性,但是属性定义时有要求,属性名后面必须添加:()
* 语法:
* 属性的类型 属性的名字();
*/
String driver() default "com.mysql.cj.jdbc.Driver"; // 使用 default 关键字来指定属性的默认值。
String url();
String user();
String password();

byte b() default 0;
short s() default 0;
int i() default 0;
long l() default 0L;
float f() default 0.0F;
double d() default 0.0;
boolean flag() default false;
char c() default '0';
Class clazz() default String.class;
Season season() default Season.SPRING;
MyAnnotation myAnnotation();

/**
* 可以是一维数组形式
* @return
*/
String[] names();

// 注解的属性的数据类型,必须是以上的几种类型,或者这几种类型的一维数组,不能是其他类型。
//Object obj();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 语法规则:如果这个注解中有属性,那么使用的时候,必须给属性赋值。没有赋值则报错。
// 除非你定义注解的时候给属性指定了默认值。
// 怎么给属性赋值?语法:@DataBaseInfo(属性名=值,属性名=值,属性名=值,属性名=值,属性名=值)
@DataBaseInfo(
//driver="oracle.jdbc.driver.OracleDriver",
url="jdbc:mysql://localhost:3306/powernode",
user="root",
password="123456",
myAnnotation=@MyAnnotation,
names={"zhangsan", "lisi", "wangwu"},
flag=true,
i=100,
clazz=Integer.class,
season=Season.WINTER)
public void connDB(){

}

注解的使用

①注解在使用时必须给属性赋值,除非你使用了default关键字为属性指定了默认值。

②如果属性只有一个,并且属性名是value时,使用注解时value可以省略不写。

③如果属性是一个数组,使用注解时,数组值只有一个,数组的大括号是可以省略的。

元注解

①用来标注注解的注解叫做元注解。(也是JDK内置的注解。)

②常用的元注解:

1
2
3
4
5
6
7
8
9
@Retention:设置注解的保持性

@Target:设置注解可以出现的位置

@Documented:设置注解是否可以生成到帮助文档中

@Inherited:设置注解是否支持继承

@Repeatable:设置注解在某一个元素上是否可以重复使用(Java8的新特性。

@Retention

①Retention英文意思有保留、保持的意思,它表示注解存在阶段是保留在源代码(编译期),字节码(类加载)或者运行时(JVM中运行)。

②在@Retention注解中使用枚举RetentionPolicy来表示注解保留时期。

1
2
3
4
5
6
@Retention(RetentionPolicy.SOURCE):注解仅存在于源代码中,在字节码文件中不包含。

@Retention(RetentionPolicy.CLASS):注解在字节码文件中存在,但运行时无法获得(默认)。

@Retention(RetentionPolicy.RUNTIME):注解在字节码文件中存在,且运行时可通过反射获取。