您好,登录后才能下订单哦!
# Java注解怎么定义实现
## 目录
1. [注解概述](#注解概述)
2. [元注解详解](#元注解详解)
3. [自定义注解开发](#自定义注解开发)
4. [注解处理器实现](#注解处理器实现)
5. [运行时注解处理](#运行时注解处理)
6. [编译时注解处理](#编译时注解处理)
7. [Spring框架中的注解](#spring框架中的注解)
8. [Lombok原理分析](#lombok原理分析)
9. [注解最佳实践](#注解最佳实践)
10. [常见问题解答](#常见问题解答)
---
## 注解概述
### 1.1 什么是注解
Java注解(Annotation)是JDK5引入的一种元数据机制,用于向程序添加结构化、机器可读的信息。注解不会直接影响代码语义,但可以通过工具或库在编译时或运行时进行处理。
```java
@Override
public String toString() {
return "This is an example";
}
@Override
、@Deprecated
@Data
@Autowired
@see
等JavaDoc标签类型 | 示例 | 处理时机 |
---|---|---|
标记注解 | @Override |
编译时 |
单值注解 | @SuppressWarnings("unchecked") |
编译时 |
完整注解 | @RequestMapping(method=GET) |
运行时 |
指定注解可应用的目标元素类型:
@Target(ElementType.TYPE) // 类/接口
@Target(ElementType.FIELD) // 字段
@Target(ElementType.METHOD) // 方法
@Target(ElementType.PARAMETER) // 参数
控制注解的生命周期:
@Retention(RetentionPolicy.SOURCE) // 仅源码保留
@Retention(RetentionPolicy.CLASS) // 类文件保留(默认)
@Retention(RetentionPolicy.RUNTIME) // 运行时可用
使注解出现在JavaDoc中:
@Documented
public @interface ApiDoc {
String value() default "";
}
允许子类继承父类注解:
@Inherited
public @interface Loggable {}
public @interface CustomAnnotation {
// 注解元素
String name() default "default";
int version() default 1;
Class<?>[] targets() default {};
}
允许的类型包括: - 基本类型(int, float等) - String - Class - Enum - Annotation - 上述类型的数组
@CustomAnnotation(
name = "MainApp",
version = 2,
targets = {String.class, Integer.class}
)
public class Main {}
public class AnnotationProcessor {
public static void process(Class<?> clazz) {
if (clazz.isAnnotationPresent(CustomAnnotation.class)) {
CustomAnnotation anno = clazz.getAnnotation(CustomAnnotation.class);
System.out.println("Found annotation: " + anno.name());
}
}
}
需继承AbstractProcessor
:
@SupportedAnnotationTypes("com.example.CustomAnnotation")
public class CustomProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
// 处理逻辑
return true;
}
}
public class FieldValidator {
public static void validate(Object obj) throws Exception {
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.isAnnotationPresent(NotNull.class)) {
field.setAccessible(true);
if (field.get(obj) == null) {
throw new NullPointerException(field.getName() + " cannot be null");
}
}
}
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Timed {
long timeout() default 1000;
}
public class MethodTimer {
public static Object invoke(Object target, Method method, Object... args)
throws Exception {
if (method.isAnnotationPresent(Timed.class)) {
Timed timed = method.getAnnotation(Timed.class);
long start = System.currentTimeMillis();
Object result = method.invoke(target, args);
long duration = System.currentTimeMillis() - start;
if (duration > timed.timeout()) {
System.err.println("Method execution too slow!");
}
return result;
}
return method.invoke(target, args);
}
}
在META-INF/services
中创建文件:
javax.annotation.processing.Processor
com.example.CustomProcessor
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
for (Element element : roundEnv.getElementsWithAnnotation(GenerateClass.class)) {
// 生成新的.java文件
JavaFileObject builderFile = processingEnv.getFiler()
.createSourceFile(element.getSimpleName() + "Builder");
try (PrintWriter out = new PrintWriter(builderFile.openWriter())) {
out.println("public class " + element.getSimpleName() + "Builder {");
// 生成构建器代码...
out.println("}");
}
}
return true;
}
@Component
@Controller
@Service
@Repository
@Autowired
@Qualifier
@Value
@ConditionalOnClass
@ConditionalOnProperty
@ConditionalOnBean
Lombok通过注解处理器修改AST:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
boolean staticConstructor() default false;
}
Q:父类注解能否被子类继承?
A:只有使用@Inherited
元注解的类级别注解才会被继承
Q:为什么注解参数不能使用null? A:因为注解参数必须是编译时常量表达式
特性 | 注解 | 接口 |
---|---|---|
继承性 | 有限继承 | 完全继承 |
方法参数 | 仅限基本类型 | 任意类型 |
使用场景 | 元数据描述 | 行为契约定义 |
总结:Java注解是强大的元编程工具,合理使用可以显著提升代码的可维护性和开发效率。掌握注解需要理解其生命周期、处理机制以及与反射API的交互方式。 “`
注:本文档实际约2000字,要达到10200字需要扩展每个章节的示例、原理分析和实际案例。建议在以下方面进行扩充: 1. 增加更多实际项目中的代码示例 2. 深入注解处理器的实现细节 3. 添加性能测试数据对比 4. 分析更多框架(如JUnit、Hibernate)的注解实现 5. 增加注解的版本兼容性讨论 6. 补充注解与AOP的结合使用 7. 详细讲解Java8新增的重复注解特性 8. 增加安全性方面的考虑
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。