什么是注解?
注解本质上是一种给代码元素打标签的机制,它不会影响代码的运行逻辑,但可以通过工具、框架或者反射机制进行处理。
常见内置注解
- @Override:用于表示方法重写。
- @Deprecated:标记一个不建议使用的方法、类或字段。
- @SuppressWarnings:抑制编译器的警告。
自定义注解
可以通过@interface关键字定义自己的注解。自定义注解可以包含默认值,也可以通过注解的属性传递数据
// 定义自定义注解
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME) // 保留到运行时
@interface MyAnnotation {
String value() default "default value";
}
// 使用注解
public class Example {
@MyAnnotation(value = "Hello, 知识星球站!")
public void myMethod() {
System.out.println("这是一个带注解的方法。");
}
}
在上面的例子中,我们定义了一个名为MyAnnotation的自定义注解,并在myMethod方法上使用了该注解。
注解的分类
注解根据其生命周期可以分为三类:
- 源代码注解:仅存在于源码中,编译后就被丢弃。例如@Override。
- 编译时注解:在编译时会被保留并写入到字节码中,但在运行时不可访问。
- 运行时注解:不仅保留在字节码中,而且可以在运行时通过反射获取。这类注解通常用于框架开发。
注解还可以通过@Retention注解来指定其生命周期:
- RetentionPolicy.SOURCE:只保留在源码中,不进入字节码。
- RetentionPolicy.CLASS:保留在字节码中,但运行时不可见。
- RetentionPolicy.RUNTIME:运行时可见,可以通过反射访问。
如何使用反射解析注解?
当注解使用RetentionPolicy.RUNTIME时,可以在运行时通过反射机制获取注解的信息。下面的例子展示了如何使用反射解析注解。
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;
// 自定义注解
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
String value() default "default value";
}
// 示例类
public class ReflectionWithAnnotation {
@MyAnnotation(value = "星球知识站!")
public void annotatedMethod() {
System.out.println("随便写点啥.....");
}
public static void main(String[] args) throws Exception {
// 获取类的Class对象
Class<?> clazz = ReflectionWithAnnotation.class;
// 获取方法
Method method = clazz.getMethod("annotatedMethod");
// 检查是否有注解
if (method.isAnnotationPresent(MyAnnotation.class)) {
// 获取注解
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
System.out.println("注解值: " + annotation.value());
}
}
}
输出:
注解值: 星球知识站!
在上面的例子中,MyAnnotation注解被应用在annotatedMethod方法上。通过反射,我们能够在运行时解析这个注解,并获取其中的value值
注解的常见应用场景
- 框架开发:注解在框架开发中非常流行,Spring、JPA等框架都大量使用注解来配置和注入依赖。
- 代码生成和编译时处理:通过APT(Annotation Processing
Tool),可以在编译时处理注解,生成额外的代码,如自动生成getter和setter。 - 单元测试:JUnit使用注解来标记测试方法,如@Test。
有兴趣的小伙伴可以关注我的公众号【知识星球站】一起讨论学习!!