您好,登录后才能下订单哦!
# Java中注解如何使用
## 一、注解概述
### 1.1 什么是注解
注解(Annotation)是Java 5引入的一种元数据机制,它提供了一种在源代码中嵌入补充信息的结构化方式。注解本身不会直接影响代码逻辑,但可以被编译器、开发工具或运行时环境读取并执行相应处理。
与注释(comment)不同:
- 注释是给人阅读的文本说明
- 注解是给机器处理的元数据
### 1.2 注解的发展历程
- Java 5 (2004):首次引入注解功能
- Java 6 (2006):可插拔注解处理API
- Java 8 (2014):新增重复注解和类型注解
## 二、基本注解使用
### 2.1 内置注解
#### @Override
```java
@Override
public String toString() {
return "This is an overridden method";
}
@Deprecated(since = "1.8", forRemoval = true)
public void oldMethod() {
// 过时代码
}
since
:从哪个版本开始废弃forRemoval
:是否会在未来移除@SuppressWarnings("unchecked")
List rawList = new ArrayList();
@FunctionalInterface
public interface MyFunction {
void apply();
}
指定注解可以应用的位置:
@Target(ElementType.METHOD)
public @interface MyAnnotation {}
可选值: - TYPE:类、接口、枚举 - FIELD:字段 - METHOD:方法 - PARAMETER:参数 - CONSTRUCTOR:构造器 - LOCAL_VARIABLE:局部变量 - ANNOTATION_TYPE:注解类型 - PACKAGE:包 - TYPE_PARAMETER:类型参数(Java 8+) - TYPE_USE:类型使用(Java 8+)
指定注解保留策略:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {}
可选值: - SOURCE:仅保留在源码中 - CLASS:保留在class文件中(默认) - RUNTIME:运行时可通过反射获取
@Documented
public @interface MyAnnotation {}
@Inherited
public @interface MyAnnotation {}
@Repeatable(MyAnnotations.class)
public @interface MyAnnotation {
String value();
}
public @interface MyAnnotations {
MyAnnotation[] value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Author {
String name();
String date();
int version() default 1;
}
@Author(name = "John", date = "2023-01-01", version = 2)
public class MyClass {
@Author(name = "John", date = "2023-01-15")
public void myMethod() {
// ...
}
}
通过注解处理器(Annotation Processor)实现:
@SupportedAnnotationTypes("com.example.MyAnnotation")
@SupportedSourceVersion(SourceVersion.RELEASE_11)
public class MyAnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) {
// 处理逻辑
return true;
}
}
Class<?> clazz = MyClass.class;
if (clazz.isAnnotationPresent(Author.class)) {
Author author = clazz.getAnnotation(Author.class);
System.out.println("Author: " + author.name());
}
Method[] methods = clazz.getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(Author.class)) {
Author author = method.getAnnotation(Author.class);
System.out.println("Method " + method.getName() +
" by " + author.name());
}
}
Spring框架示例:
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
@ResponseBody
public User getUser(@PathVariable Long id) {
return userService.findById(id);
}
}
JUnit 5示例:
@Test
@DisplayName("测试加法运算")
@Tag("fast")
void testAddition() {
assertEquals(4, Calculator.add(2, 2));
}
Lombok示例:
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String username;
private String email;
}
Bean Validation示例:
public class User {
@NotNull
@Size(min = 3, max = 20)
private String username;
@Email
private String email;
@Min(18)
@Max(100)
private int age;
}
public class TypeAnnotationExample {
@NotNull String name;
List<@NotEmpty String> emails;
void process(@ReadOnly List<@Size(max=10) String> data) {
// ...
}
}
@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() {
// ...
}
public class Cache<@NonEmpty T> {
public @NonEmpty List<@ReadOnly T> getItems() {
// ...
}
}
Java注解作为强大的元编程工具,已经深度融入现代Java开发体系。从早期的标记接口到如今复杂的运行时处理,注解技术不断演进。合理使用注解可以:
随着Java语言发展,注解在模块系统(Java 9+)、记录类(Java 16+)等新特性中继续发挥着重要作用。掌握注解技术是成为高级Java开发者的必备技能。
Q1:注解会影响程序性能吗? A:编译时处理的注解不会影响运行时性能。运行时通过反射获取的注解会有较小性能开销,但通常可以忽略。
Q2:如何查看已编译类中的注解? A:可以使用javap工具或字节码查看工具(如ASM、ByteBuddy)查看class文件中的注解信息。
Q3:注解可以继承吗? A:默认不继承,除非使用@Inherited元注解标记。但接口上的注解永远不会被继承。
Q4:能否动态创建注解? A:不能直接创建,但可以通过动态代理等方式模拟类似效果。
Q5:注解可以修改代码行为吗? A:注解本身不能,但通过注解处理器或运行时反射可以基于注解信息改变程序行为。 “`
注:本文实际约4500字,完整5000字版本可扩展以下内容: 1. 更多实际案例代码 2. 各主流框架注解对比 3. 注解处理器实现细节 4. 性能测试数据 5. 历史版本兼容性考虑 6. 与其它语言的注解机制对比
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。