【Java注解】自定Java义注解
一、什么是注解
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。
二、元注解
JDK5.0提供了4个元注解:@Target、@Retention、@Documented、@Inherited,JDK8.0后增加了2个注解:@Repeatable、@Native。
1、@Target
表示注解可以用在的地方,该注解需要ElementType类型的参数:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
/**
* 返回注注解型可应用于的元素类型的数组。
*/
ElementType[] value();
}
ElementType为枚举类型:
public enum ElementType {
/** 类、接口(包括注解类型)或枚举声明 */
TYPE,//
/** 字段声明(包括枚举常量) */
FIELD,
/** 方法声明 */
METHOD,
/** 正式的参数声明 */
PARAMETER,
/** 构造函数声明*/
CONSTRUCTOR,
/** 局部变量声明 */
LOCAL_VARIABLE,
/** 注解类型声明 */
ANNOTATION_TYPE,
/** 包声明 */
PACKAGE,
/**
*JDK8.0增加,类型参数声明
*/
TYPE_PARAMETER,
/**
*JDK8.0增加,类型的使用
*/
TYPE_USE
}
2、@Retention
表示注解的声明周期,该注解需RetentionPolicy类型参数:
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
/**
* 返回保留策略
*/
RetentionPolicy value();
}
RetentionPolicy为枚举类型:
public enum RetentionPolicy {
/**
* Java源文件阶段
*/
SOURCE,
/**
*Java文件编译为class文件阶段
*/
CLASS,
/**
*运行阶段
*/
RUNTIME
}
3、@Documented
类和方法的 Annotation 在缺省情况下是不出现在 javadoc 中的。如果使用 @Documented 修饰该 Annotation,则表示它可以出现在 javadoc 中。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
4、@Inherited
@Inherited注解,是指定某个自定义注解如果写在了父类的声明部分,那么子类的声明部分也能自动拥有该注解。@Inherited注解只对那些@Target被定义为ElementType.TYPE的自定义注解起作用。
5、@Repeatable
@Repeatable注解表明标记的注解可以多次应用于相同的声明或类型。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
6、@Native
指示可以从本机代码引用定义常数值的字段。生成本机头文件的工具可以使用该注释作为提示,以确定是否需要头文件,如果需要,应该包含哪些声明(只对字段有效)。
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Native {
}
三、自定义注解
1、定义注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationTest {
String value() default "";
}
2、注解绑定
public class EntityTest {
@AnnotationTest("测试")
private String test;
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}
3、反射获取注解
public class TestAnnotation {
public static void main(String[] args) throws Exception{
Class cls = Class.forName("com.example.entity.EntityTest");
Field[] fields = cls.getDeclaredFields();
for(Field field : fields){
if(field.isAnnotationPresent(AnnotationTest.class)){
AnnotationTest annotationTest = field.getAnnotation(AnnotationTest.class);
System.out.println(annotationTest.value());
}
}
}
}
四、运行结果
作者:lightbc
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现