【注解】Java自定义注解
目录
1、什么是注解
2、自定义注解的定义
3、使用自定义注解
4、处理自定义注解
5、注解处理器
5.1、定义注解
5.2、实现注解处理器
6、应用场景
7、总结
1、什么是注解
Java注解(Annotation)又称为Java标注,是Java 5开始支持加入源代码的特殊语法元数据。是附加在代码上的一些元信息,可以用于添加元数据、配置或行为到代码中,支持自定义注解,是一个强大的功能,自定义注解的实现包括定义注解、处理注解(通过反射或注解处理器)以及在实际代码中使用注解。注解相关类都包含在java.lang.annotation包中。
2、自定义注解的定义
自定义注解使用@interface
关键字定义。常见的自定义注解分为四类,用在类上面、注解用在方法上面、注解用在属性上面、注解用在参数上面,注解可以包含元素(类似于方法),这些元素可以有默认值。
package com.gs.test.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//定义注解的作用目标(类,方法,字段等)
@Target(ElementType.METHOD)
//定义注解的生命周期(SOURCE,CLASS,RUNTIME)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
//定义注解的元素
String value() default "default value";
int count();
}
-
@Target
:指定注解可以应用的目标(如方法、类、字段等)。常用值:-
ElementType.METHOD
:方法 -
ElementType.TYPE
:类或接口 -
ElementType.FIELD
:字段 -
ElementType.PARAMETER
:参数
-
-
@Retention
:指定注解的生命周期。常用值:-
RetentionPolicy.SOURCE
:仅保留在源码中,编译时丢弃。 -
RetentionPolicy.CLASS
:保留到编译后的字节码中,但运行时不可见。 -
RetentionPolicy.RUNTIME
:保留到运行时,可以通过反射读取。
-
3、使用自定义注解
定义好注解后,可以在代码中使用它。
package com.gs.test.annotation;
public class MyService {
@CustomAnnotation(value = "custom value", count = 3)
public void myMethod(){
System.out.println("executing myMethod");
}
}
4、处理自定义注解
通过反射机制,可以在运行时读取注解信息并执行相应的逻辑。
示例:通过反射读取注解信息
package com.gs.test.annotation;
import java.lang.reflect.Method;
public class AnnotationProcessor {
public static void main(String[] args) {
// 获取目标类的Class对象
Class<MyService> clazz = MyService.class;
// 遍历类中的所有方法
for (Method method : clazz.getDeclaredMethods()) {
// 检查方法是否使用了自定义注解
if (method.isAnnotationPresent(CustomAnnotation.class)) {
// 获取注解实例
CustomAnnotation annotation = method.getAnnotation(CustomAnnotation.class);
// 读取注解的值
String value = annotation.value();
int count = annotation.count();
System.out.println("Method: " + method.getName());
System.out.println("Value: " + value);
System.out.println("Count: " + count);
// 根据注解的值执行逻辑
for (int i = 0; i < count; i++) {
System.out.println("Executing logic based on annotation: " + value);
}
}
}
}
}
5、注解处理器
如果需要编译时处理注解,可以使用注解处理器(Annotation Processor)。注解处理器可以生成代码、验证代码或执行其他编译时任务。
示例:实现一个简单的注解处理器
5.1、定义注解
package com.gs.test.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)//注解只在源码保留
public @interface GenerateToString {
}
5.2、实现注解处理器
package com.gs.test.annotation;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
import java.util.Set;
@SupportedAnnotationTypes("GenerateToString")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class GenerateToStringProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
// 处理注解逻辑
annotations.forEach(annotation -> {
roundEnv.getElementsAnnotatedWith(annotation).forEach(element -> {
String className = element.getSimpleName().toString();
System.out.println("Generating toString() for class: " + className);
});
});
return true;
}
}
6、应用场景
自定义注解在实际开发中有广泛的应用场景,例如:
-
框架开发:如Spring中的
@Controller
、@Service
等。 -
代码生成:如Lombok的
@Data
、@Getter
等。 -
验证逻辑:如自定义参数校验注解。
-
日志记录:通过注解自动记录方法调用日志。
-
权限控制:通过注解实现方法级别的权限校验。
7、总结
自定义注解的实现包括定义注解、使用注解和处理注解三个步骤。通过反射可以在运行时读取注解信息,而注解处理器可以在编译时处理注解。合理使用自定义注解可以显著提高代码的可读性和可维护性。