全面剖析Java中的注解(Annotation)
1. 什么是注解
注解(Annotation),是Java 5之后引入的一个重要特性。它是Java语言旨在简化Java开发的一种方式,是代码级别的说明标记,用于描述类、方法、变量等元素的信息。
注解本身并没有实际的执行逻辑,它只是代码的一种附加说明、标记或元数据,提供了一种结构化的方式来描述程序和配置信息。注解可以通过反射机制获取,从而完成代码分析、动态代理、单元测试等功能。
常见的注解有:@Override、@Deprecated、@SuppressWarnings等。
2. 注解的使用
注解用于描述程序和配置信息,可以应用于Java源代码中的多个元素。
2.1 声明注解
public @interface MyAnnotation {
String name() default "defaultName";
int age() default 0;
}
注解是使用 @interface
关键字定义的。
2.2 应用注解
2.2.1 类注解的使用
@MyAnnotation(name="Tom",age=20)
public class MyClass {
...
}
在类上应用注解 MyAnnotation
,并指定 name
和 age
的值。
2.2.2 方法注解的使用
public class MyClass {
@MyAnnotation(name="Tom",age=20)
public void myMethod() {
...
}
}
在方法上应用注解 MyAnnotation
,并指定 name
和 age
的值。
3. 注解的元素
注解可以有多个元素,每个元素就是一个变量,类似于接口中的方法,可以带默认值。元素的声明方式类似于方法声明:
public @interface MyAnnotation {
String name();
int age();
}
3.1 元素带默认值
public @interface MyAnnotation {
String name() default "defaultName";
int age() default 0;
}
元素 name
和 age
带有默认值 "defaultName"
和 0
。
3.2 元素带数组类型
public @interface MyAnnotation {
String[] tags() default {};
}
元素 tags
是一个字符串数组类型,带有默认值 {}
。
3.3 元素带枚举类型
public enum Gender {
MALE,FEMALE,OTHER;
}
public @interface MyAnnotation {
Gender gender() default Gender.OTHER;
}
元素 gender
是一个枚举类型 Gender
,带有默认值 Gender.OTHER
。
4. 注解的生命周期
注解的生命周期是指注解存在的期限。Java中的注解有三种生命周期:源码级别(@Retention(RetentionPolicy.SOURCE))、类文件级别(@Retention(RetentionPolicy.CLASS))、运行时级别(@Retention(RetentionPolicy.RUNTIME))。
4.1 源码级别
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation {
String name() default "defaultName";
int age() default 0;
}
在源码级别上声明的注解只存在于源代码中,在编译时会被丢弃。
4.2 类文件级别
@Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation {
String name() default "defaultName";
int age() default 0;
}
在类文件级别上声明的注解存在于编译后的字节码中,但在运行时不会被JVM加载。
4.3 运行时级别
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String name() default "defaultName";
int age() default 0;
}
在运行时级别上声明的注解存在于编译后的字节码中,且在运行时也会被JVM加载,并提供相应的反射方法调用。
5. 示例
5.1 spring中的注解
Spring框架中广泛使用注解来描述Bean之间的依赖关系和声明Bean的行为。例如:@Autowired、@Component、@Configuration、@Bean等。
@Configuration
public class MyConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
@Component
public class MyController {
@Autowired
private MyService myService;
...
}
使用 @Configuration
注解声明一个配置类,并使用 @Bean
注解声明一个Bean,在 MyController
类中使用 @Autowired
注解自动注入 MyService
实例。
5.2 lombok中的注解
Lombok是一个Java库,它通过注解的方式在编译期自动生成Java类的getter、setter、toString、equals等方法,以简化Java开发,提高开发效率。
@Data
public class User {
private Long id;
private String name;
private Integer age;
}
@NoArgsConstructor
@AllArgsConstructor
public class MyException extends RuntimeException {
private String code;
private String message;
}
使用 @Data
注解自动生成getter、setter、toString等方法,在 MyException
中使用 @NoArgsConstructor
和 @AllArgsConstructor
注解自动生成无参构造方法和全参构造方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:全面剖析java中的注解(Annotation) - Python技术站