十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Java 注解真的只是“打个标签”吗?

Java 注解真的只是“打个标签”吗? 目录介绍元注解TargetRetentionInheritedRepeatable演示使用介绍注解是什么注解本质上是元数据一种代码级别的注释。用处给类方法接口等添加额外的信息原理使用 interface 定义注解。注解在编译后会成为一种特殊的接口类型并继承 java.lang.annotation.Annotation。注解本质上可以理解为一种特殊的接口。然后通过编译器、JVM 或框架读取并使用这些信息。元注解用来“描述注解的注解”。Target指定注解的使用范围---ElementTypeElementType可以使用的位置举例TYPE类、接口、枚举Service class UserServiceMETHOD方法Override void run()FIELD成员变量Autowired UserService servicePARAMETER方法参数void test(Param String name)CONSTRUCTOR构造方法Inject UserService()LOCAL_VARIABLE局部变量Nullable String namePACKAGE包xxx package com.exampleANNOTATION_TYPE注解给“注解”本身加注解Retention指定注解的保留时期--RetentionPolicyRetentionPolicy保留时期编译后运行时反射SOURCE只保留在源码阶段❌ 编译后丢弃❌ 无法获取CLASS保留到编译后的.class文件✅ 保留❌ 无法获取RUNTIME一直保留到运行阶段✅ 保留✅ 可以通过反射获取和使用Inherited类上的注解是否可以被子类继承Repeatable同一个注解可以使用多次演示使用反射中的Class对象可以获取一个类的各种元信息。前面我们学习到注解属于类的元数据因此我们可以通过Class对象获取这个类上的注解。注解属性在正常情况下只能读取不能在运行时修改。也就是说我们在写代码时就已经pinned。1. 注解定义Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface MyAnnotation { // 定义注解属性 // 1. String属性定义 String myStringMeta() default 今天是2026.8.23,天气非常不错; // 2. 基本类型属性定义 int count() default 23; boolean enable() default true; //... // 3. Class Class? target() default Object.class; // 4. 枚举 Level level() default Level.TOP; }2. 应用到类中的某一方法public class MyTest { MyAnnotation( myStringMeta 这是一个测试, count 24, enable false, target Test.class, level Level.NORMAL ) public void testMethod(){ System.out.println(-----方法体----); } }3. 获取注解并读取属性public class Test { public static void main(String[] args) throws NoSuchMethodException { Method method MyTest.class.getMethod(testMethod); MyAnnotation annotation method.getAnnotation(MyAnnotation.class); System.out.println(annotation.myStringMeta()); System.out.println(annotation.count()); System.out.println(annotation.enable()); System.out.println(annotation.level()); System.out.println(annotation.target()); } }输出这是一个测试24falseNORMALclass com.zzy.annotationdemo.Test演示代码JavaBasic/annotationdemo at main · LuSwordman/JavaBasichttps://github.com/LuSwordman/JavaBasic/tree/main/annotationdemo
返回列表