一、什么是java Annotation
Java 从1.5开始提供了 Annotation (注释,标注),它用来修饰应用程序的元素(类,方法,属性,参数,本地变量,包、元数据),编译器将其与元数据一同存储在 class 文件中,运行期间通过 Java 的反射来处理对其修饰元素的访问。Annotation 仅仅用来修饰元素,而不能影响代码的执行。只有通过其配套的框架或工具才能对其信息进行访问和处理。
解释 1:注解是一种能被添加到 java 源代码中的元数据,方法、类、参数和包都可以用注解来修饰是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记的处理。
解释 2:Java 注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配关类都包含在 java.lang.annotation 包中。
二、注解分类:
1.自定义注解。
2.JDK 内置注解。
3.第三方框架提供的注解。
例如:@Override 重写
@SuppressWarnings(value = “unchecked”) 压制编辑器警告
【1.三种内建注解】
- @Override——当我们想要复写父类中的方法时,我们需要使用该注解去告知编译器我们想要复写这个方法。的方法移除或者发生更改时编译器将提示错误信息。
- @Deprecated——当我们希望编译器知道某一方法不建议使用时,我们应该使用这个注解。Java 在 javadoc 解,我们应该提供为什么该方法不推荐使用以及替代的方法。
- @SuppressWarnings——这个仅仅是告诉编译器忽略特定的警告信息,例如在泛型中使用原生数据类型。它的(译者注:在源文件中有效)并且被编译器丢弃。
【2.java 元注解和自定义注解的区别】
Java 的自定义注解是一种元数据,可以应用于类、方法、字段等程序元素上,以提供额外的信息或指示。
自定义注解包括注解声明、元注解、运行时处理器三个部分。注解声明指定了注解的名称、作用域注解则用来对注解进行修饰;运行时处理器则负责在程序运行过程中处理注解,并根据注解提供的信息执行相应解在编写框架、插件等开发时非常常见,可以为代码提供更多的灵活性和可扩展性。
【3.自定义注解实现】
实现步骤
1.定义注解类,指定注解的元素和属性。
2.在需要使用注解的地方,使用@注解名称来标注目标元素,可以是类、方法、字段等程序元素。
3.可以使用反射机制获取注解,并对注解进行处理。
public @interface 注解名称{
属性列表;
}
使用位置:
实际开发中,注解常常出现在类、方法、成员变量、形参位置。当然还有其他位置。
级别:注解和类、接口、枚举是同一级别的。
Java 自定义注解可以通过注解定义类来实现。
具体步骤如下:
1.使用@interface 关键字定义自定义注解。
2.在注解定义中添加属性,以传递数据。
3.为自定义注解添加元注解,如@Retention、@Target 等,以限制注解的使用范围。
4.在需要使用自定义注解的类、方法、字段上添加注解。
5.使用反射机制获取注解信息,实现注解的处理逻辑。
用@interface 关键字定义注解,注解的成员参数只能是基本类型、String、Class、Enum、Annotation 或者它们使用元注解@Target、@Retention、@Documented、@Inherited、@Repeatable 来修饰自定义注解,指定注解的作期、文档生成、继承性和重复性等属性。
使用反射 API 来获取注解信息,并根据注解的逻辑进行相应的处理。
【注意事项】
@interface 是用来修饰 Annotation (注解)的,它不是 interface。
这个关键字声明隐含了一个信息:它是继承了java.lang.annotation.Annotation 接口,而不是声明了一个 interface。
注解的本质是接口 , 接口中可以定义 常量 和 方法 ;
在注解中定义 接口方法 , 就是 注解的属性 ;
为注解添加属性 : 接口中的方法都是抽象方法 , 其中 public abstract 可以省略 ;
public @interface Annotation {
public abstract String path();
}
注解属性使用格式 :
@注解名称(属性名称 = 属性值)
注解属性使用 : 在相关的代码上使用
@Annotation(path = “”)
Student(String name, int age){
}
【案例代码】
自定义注解代码
package k2_zhujie;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author nanzhi
* @date 2024/7/16 15:40
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ZhuJie {
String value();
}
自定义注解代码测试demo
package k2_zhujie;
import org.junit.Test;
import java.lang.reflect.Method;
/**
* @author nanzhi
* @date 2024/7/16 15:39
* 源码-->字节码-->加载jvm
*/
public class demo {
@Deprecated//官方注解:不赞成使用
@SuppressWarnings("all")//官方注解:抑制警告
@Test//第三方框架提供的注解(有返回值的方法无法测试)
@ZhuJie("HELLO JAVA!")//自定义注解
public void method() {
System.out.println("111 = " + 111);
}
public static void main(String[] args) throws NoSuchMethodException {
//运行时通过虚拟机中的字节码类对象获取源码中的方法
Method method = demo.class.getDeclaredMethod("method");
ZhuJie annotation = method.getAnnotation(ZhuJie.class);
String value = annotation.value();
System.out.println("value = " + value);
}
}