Java:@Repeatable注解的使用和反射获取

Posted 你是小KS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java:@Repeatable注解的使用和反射获取相关的知识,希望对你有一定的参考价值。

当前环境:JDK1.8

1. 声明

当前内容主要用于本人学习和复习java的基础知识,主要为@Repeatable注解的使用,以及部分注解的使用

主要参考:Oracle官方文档

主要为:

  1. 使用@Repeatable和获取@Repeatable修饰的注解属性
  2. 在类变量前面使用注解(这个好像无法反射获取)

2. @Repeatable基本demo

首先需要一个代表单数的注解

import java.lang.annotation.Repeatable;
import com.sun.istack.NotNull;
@Repeatable(Authors.class)
public @interface Author {
	// 添加非空校验
	@NotNull
	String name();

	@NotNull
	String createTime();

}

然后在一个代表复数的注解中的value方法中返回上面这个单数的注解类数组

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

//	注意当前的Authors中如果不加这句话那马不可使用反射方式获取Author的注解
@Retention(RetentionPolicy.RUNTIME)
public @interface Authors {
	Author[] value();
}

这里需要注意的是,如果想要在运行的时候获取@Author注解必须在Authors的上面添加这个@Retention(RetentionPolicy.RUNTIME)(这个注解不能放在Author上面)

并且,@Author上面不能有与当前的@Repeatable的注解中有相同的注解,否则编译报错

@NotNull注解强制用户输入必要的参数

最后的使用

@Author(createTime = "2021-07-03", name = "hy")
@Author(createTime = "2021-07-03", name = "zs")
public class Book {
	private String author;
	private String name;

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

这样就可以在一个类上面使用相同的注解了(感觉就是,将注解替换为了@Authors)

反射获取@Author注解中的方法返回值

/**
 * 
 * @author hy
 * @createTime 2021-07-03 08:49:07
 * @description 主要为再测试java中的注解
 *
 */
public class AnnotationTest {
	// 默认运行的时候是可以得到的
	public static void main(String[] args) {
		Book book = new Book();
		Class<? extends Book> clazz = book.getClass();
		// Annotation[] declaredAnnotations = clazz.getDeclaredAnnotations();
		// 注意下面的操作无法获取当前的注解
		Annotation[] annotations = clazz.getAnnotations();
		System.out.println("获取到所有的注解" + annotations.length);
		Author[] annotationsByType = clazz.getAnnotationsByType(Author.class);
		System.out.println(annotationsByType);
		if (annotationsByType == null || annotationsByType.length == 0) {
			System.out.println("未获取到当前注解为Author的属性");
			return;
		}
		if (annotationsByType != null) {
			for (int i = 0; i < annotationsByType.length; i++) {
				Author author = annotationsByType[i];
				String createTime = author.createTime();
				String name = author.name();
				System.out.println(name + ":" + createTime);
			}
		}

	}

}

执行结果:
在这里插入图片描述

3.在变量前使用注解


import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import com.sun.istack.Nullable;

@Retention(RetentionPolicy.RUNTIME)
@Target(value = { java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD,
		java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.LOCAL_VARIABLE })
public @interface Note {
	@Nullable
	String value() default "";
}

基本使用

import com.sun.istack.NotNull;

/**
 * 
 * @author hy
 * @createTime 2021-07-03 09:58:41
 * @description 当前内容主要为测试和使用annotation注解修饰变量
 *
 */
public class NewAnnotationTest /* implements @Readonly List<T> 不支持这个格式的操作*/ {
	public static void main(String[] args) {

		@Note("备注") // 注解可以放在当前的变量的前面
		Book book = new Book();
		Note annotation = book.getClass().getDeclaredAnnotation(Note.class);
		Annotation[] annotations = book.getClass().getAnnotations();
		System.out.println(annotation);
		System.out.println(Arrays.toString(annotations));
		// 如何获取本地变量声明
	}

	public static void print(@NotNull String str) {
		String string = str.toString();
		System.out.println(string);
	}
}

可以在方法内部的变量的类型前面使用注解,主要靠的是java.lang.annotation.ElementType.LOCAL_VARIABLE,但是又无法通过变量方式访问这个标记,本人通过javap方式发现编译中有Note注解,但是里面的内容消失了

以上是关于Java:@Repeatable注解的使用和反射获取的主要内容,如果未能解决你的问题,请参考以下文章

Java8: @Repeatable注解原理和使用技巧

Java编程:Java8 新增的 @Repeatable 注解

JAVA注解详解(@Target,@Documented,@Retention,@Inherited,@Native,@Repeatable)

JAVA注解详解(@Target,@Documented,@Retention,@Inherited,@Native,@Repeatable)

注解深入浅出(四反射)

注解深入浅出(四反射)