java 注解如何实现
注解的基本概念
注解(Annotation)是Java提供的一种元数据形式,用于为代码添加标记信息。注解本身不直接影响代码逻辑,但可以通过反射或编译时处理实现特定功能。
定义自定义注解
使用@interface关键字定义注解,并通过元注解(如@Target、@Retention)指定其行为:

import java.lang.annotation.*;
@Target(ElementType.METHOD) // 注解作用目标(方法、类等)
@Retention(RetentionPolicy.RUNTIME) // 注解保留策略(源码、编译、运行时)
public @interface CustomAnnotation {
String value() default "default"; // 注解属性,可设置默认值
int priority() default 1;
}
使用注解
在类、方法或字段上直接添加注解:

public class Example {
@CustomAnnotation(value = "test", priority = 2)
public void annotatedMethod() {
System.out.println("Method with annotation");
}
}
通过反射处理注解
利用反射机制在运行时读取注解信息并执行逻辑:
import java.lang.reflect.Method;
public class AnnotationProcessor {
public static void processAnnotations(Object obj) throws Exception {
Class<?> clazz = obj.getClass();
for (Method method : clazz.getDeclaredMethods()) {
if (method.isAnnotationPresent(CustomAnnotation.class)) {
CustomAnnotation annotation = method.getAnnotation(CustomAnnotation.class);
System.out.println("Found annotation with value: " + annotation.value());
method.invoke(obj); // 调用被注解标记的方法
}
}
}
}
编译时注解处理
通过实现AbstractProcessor在编译时生成代码或检查注解:
import javax.annotation.processing.*;
import javax.lang.model.element.*;
import java.util.Set;
@SupportedAnnotationTypes("com.example.CustomAnnotation")
public class CustomAnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element element : roundEnv.getElementsAnnotatedWith(CustomAnnotation.class)) {
// 处理注解逻辑,如生成代码或报告错误
System.out.println("Processed element: " + element.getSimpleName());
}
return true;
}
}
常见元注解说明
@Target:指定注解适用的目标类型(如ElementType.METHOD)。@Retention:定义注解生命周期(如RetentionPolicy.RUNTIME)。@Documented:将注解包含在Javadoc中。@Inherited:允许子类继承父类的注解。
实际应用场景
- 框架集成:Spring的
@Autowired、JUnit的@Test。 - 代码生成:Lombok通过编译时注解生成getter/setter。
- 验证逻辑:自定义注解校验参数合法性。
通过结合反射或编译时处理,注解能显著提升代码的灵活性和可维护性。






