【Java】第三十一节 元注解

@Target

用于说明被添加了该元注解的注解可以用在哪些地方,如果没加该元注解,则定义的这个注解可以用在任意合理位置,该元注解有一个属性“ElementType[] value();”,该属性有以下几个属性值:

  • ElementType.ANNOTATION_TYPE:应用于其他注解的元注解
  • ElementType.CONSTRUCTOR:应用于构造函数
  • ElementType.FIELD:应用于全局属性
  • ElementType.LOCAL_VARIABLE:应用于方法中的本地变量
  • ElementType.METHOD:应用于方法
  • ElementType.PACKAGE:应用于包
  • ElementType.PARAMETER:应用于方法的参数
  • ElementType.TYPE:应用于类、接口或者枚举声明
例:

自定义一个注解

package com.jpc.zhujie;

import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;

import java.lang.annotation.Target;

@Target({ TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR })
public @interface TargetTest {

	String value();
}

测试类

package com.jpc.zhujie;

@TargetTest("类")
public class Test1 {
	
	@TargetTest("属性")
	private String name;
	
	@TargetTest("构造方法")
	public Test1(@TargetTest("参数") String name) {
		this.name = name;
	}
	
	@TargetTest("普通方法")
	public void show(@TargetTest("参数") int age) {
		System.out.println("name:"+name+",age:"+age);
	}
}

上面的测试类中所用的注解没有报错,是因为在元注解@Target中的value属性中都做了声明,如果没有相应的声明则会报错

@Retention

该元注解用于声明被该元注解修饰的注解的生命时长,该元注解有一个属性“RetentionPolicy value();”,该属性有以下三个属性值:

  • RetentionPolicy.SOURCE:编译器将直接丢弃被修饰的注解;
  • RetentionPolicy.CLASS:默认值,编译器将把注解记录在class文件中,当运行Java程序时,虚拟机不再保留注解;
  • RetentionPolicy.RUNTIME:编译器将把注解记录在class文件中,当运行java程序时,虚拟机保留注解,程序可以通过反射获取该注解;
例:

自定义一个注解

package com.jpc.zhujie;

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

@Retention(RetentionPolicy.SOURCE)
public @interface TargetTest {
}

测试类

package com.jpc.zhujie;

@TargetTest
public class Test1 {
	
	public static void main(String[] args) {
		TargetTest annotation = Test1.class.getAnnotation(TargetTest.class);
		System.out.println(annotation);
	}
}

运行结果如下
在这里插入图片描述
将元注解@Retention的参数设置为“RetentionPolicy.CLASS”,然后运行测试类,结果如下:
在这里插入图片描述
将元注解@Retention的参数设置为“RetentionPolicy.RUNTIME”,然后运行测试类,结果如下:
在这里插入图片描述

@Documented

导出javadoc时,被该元注解修饰的自定义注解也会生成在文档中

@Inherited

如果父类所使用的注解有@Inherited修饰,则子类可以继承该注解,否则不能继承

发布了128 篇原创文章 · 获赞 17 · 访问量 2753

猜你喜欢

转载自blog.csdn.net/qq_43705275/article/details/103887747