提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、在编译时进行格式检查(JDK内置的三个基本注解)
- 二、使用步骤
-
- 1.理解Annotation
- 2.Annocation的使用示例
- 3.如何自定义注解
- [4.jdk 提供的4种元注解](#4.jdk 提供的4种元注解)
- 5.通过反射获得注解信息
- [6.jdk 8 中注解的新特性: 可重复注解、类型注解](#6.jdk 8 中注解的新特性: 可重复注解、类型注解)
-
- [6.1 可重复注解](#6.1 可重复注解)
- [6.2 类型注解](#6.2 类型注解)
- 7.元注解
- 三、代码案例
提示:以下是本篇文章正文内容,下面案例可供参考
一、在编译时进行格式检查(JDK内置的三个基本注解)
二、使用步骤
1.理解Annotation
① jdk 5.0 新增的功能
② Annotation,其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相关操作,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
2.Annocation的使用示例
示例一: 生成文档相关的注解
示例二: 在编译时进行格式检查(JDK内置的三个基本注解)
@Override: 限定重写父类方法,该注解只能用于方法@Deprecated: 用于表示所修饰的元素(类,方法等)已过时。@SuppressWarnings: 抑制编译器警告
示例三: 跟踪代码依赖性,实现替代配置文件功能
3.如何自定义注解
参照@SuppressWarning定义
① 注解声明为: @interface
②内部定义成员,通常使用value表示
③可以指定成员的默认值,使用default 定义
④如果自定义注解没有成员,表明是一个标识作用
如果注解有成员,在使用注解时,需要指明成员的值。
自定义注解必须配上注解的信息处理流程( 使用反射)才有意义。
自定义注解通过都会指明两个元注解: Retention、Target
4.jdk 提供的4种元注解
元注解:对现有的注解进行解释说明的注解
Retention: 指定所修饰的 Annotation 的生命周期: SOURCE\CLASS (默认行为)\RUNTIME
只有声明为RUNTIME生命周期的注解,才能通过反射获得。
Target: 用于指定被修饰的 Annotation 能用于修饰哪些程序元素
Documented:表示所修施的注解在被iavadoc 解析时,保留下来
Inherited:被它修饰的 Annotation 将具有继承性
5.通过反射获得注解信息
6.jdk 8 中注解的新特性: 可重复注解、类型注解
6.1 可重复注解
1.在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class
2.MyAnnotation的Target和Retentiond等元注解与MyAnnotations相同.
6.2 类型注解
ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)
ELementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。
7.元注解
元注解:对现有的注解进行解释说明的注解。
三、代码案例
1.自定义注解
cpp
package com.tyust.edu;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
/**
* 自定义注解
* @author YML TYUST-XDU 2019-2026
* @create 2023-10-09 10:22
*/
@Inherited
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnnotation {
// String[] value();
String[] value() default "hello";
}
cpp
package com.tyust.edu;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.ElementType.LOCAL_VARIABLE;
/**
* @author YML TYUST-XDU 2019-2026
* @create 2023-10-09 10:57
*/
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
public @interface MyAnnotations {
MyAnnotation[] value();
}
2.JDK内置的三个基本注解
cpp
package com.tyust.edu;
import org.junit.Test;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.Date;
/**
* JDK内置的三个基本注解
* @author YML TYUST-XDU 2019-2026
* @create 2023-10-09 10:08
*/
public class AnnotationTest {
public static void main(String[] args) {
Person p = new Student();
p.walk();
// @Deprecated
//@Contract(pure = true)
//public Date( int year,
// @MagicConstant(intValues = {Calendar.JANUARY,Calendar.FEBRUARY,Calendar.MARCH,Calendar.APRIL,Calendar.MAY,Calendar.JUNE,Calendar.JULY,Calendar.AUGUST,Calendar.SEPTEMBER,Calendar.OCTOBER,Calendar.NOVEMBER,Calendar.DECEMBER}) int month,
// int date )
Date date = new Date(2023,20,9);
System.out.println(date);
@SuppressWarnings("unused")
int num = 10;
}
//通过反射获取注解信息
@Test
public void testGetAnnotation(){
Class clazz = Student.class;
Annotation[] annotations = clazz.getAnnotations();
for (int i = 0; i <annotations.length; i++) {
System.out.println(annotations[i]);
}
}
}
//@MyAnnotation(value = "hello")
//jdk8之前的写法
//@MyAnnotations({@MyAnnotation(value = "hello"),@MyAnnotation(value = "hi")})
@MyAnnotation(value = "hello")
@MyAnnotation(value = "hi")
class Person{
String name;
int age;
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void walk(){
System.out.println("人走路");
}
public void eat(){
System.out.println("人吃饭");
}
}
interface Info1{
void show();
}
class Student extends Person implements Info1{
@Override
public void walk() {
System.out.println("学生走路");
}
@Override
public void show() {
}
}
class Generic<@MyAnnotation T>{
public void show()throws @MyAnnotation RuntimeException{
ArrayList<@MyAnnotation String> list = new ArrayList<>();
int num = (@MyAnnotation int)10L;
}
}