注解的作用
- 编译检查
- 注解具有”让编译器进行编译检查的作用”,如
@Override放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出;
- 注解具有”让编译器进行编译检查的作用”,如
- 编写文档
- 通过代码里标识的注解生成文档,常用的有
@see,@param,@return等;
- 通过代码里标识的注解生成文档,常用的有
- 能够帮忙查看查看代码
- 通过代码里标识的注解对代码进行分析(使用反射),通过@Override, @Deprecated等,我们能很方便的了解程序的大致结构;
- 跟踪代码依赖性,实现替代配置文件功能
- 定义一个注解 ```java package configuration;
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.RUNTIME) public @interface FruitProvider { int id() default -1;//供应商编号
String name() default "";//供应商名称String address() default "";//供应商地址
}
2. 对一个类使用注解```javapackage configuration;@FruitProvider(id = 1, name = "盒马", address = "杭州")public class Apple {private int providerId;private String providerName;private String providerAddress;public void setProviderId(int providerId) {this.providerId = providerId;}public void setProviderName(String providerName) {this.providerName = providerName;}public void setProviderAddress(String providerAddress) {this.providerAddress = providerAddress;}@Overridepublic String toString() {return "Apple{" +"providerId=" + providerId +", providerName='" + providerName + '\'' +", providerAddress='" + providerAddress + '\'' +'}';}}
- 注解处理器 ```java package configuration;
import java.lang.reflect.Constructor;
public class FruitInfoUtil {
public static Apple getAppleProvider(Class
```javapackage configuration;public class AppleTest {public static void main(String[] args) throws Exception {Apple apple = FruitInfoUtil.getAppleProvider(Apple.class);System.out.println(apple);}}
内置注解
@Overwrite
若某个方法被 @Override 的标注,则意味着该方法会覆盖父类中的同名方法。如果有方法被 @Override 标示,但父类中却没有”被 @Override 标注”的同名方法,则编译器会报错。
@Deprecated
该注解标注的内容,已过时,不建议再使用,编译器会给相应的提示信息
@SuppressWarnings
自定义注解
注解格式
元注解public @interface 注解名称{}
注解本质
反编译后:
public interface cn.linsman.MyAnnotation extends java.lang.annotation.Annotation {
}
所以注解本质上就是一个接口,该接口默认继承Annotation接口
注解属性
注解属性就是接口中的抽象方法
属性返回值类型**:
- 基本数据类型
- String
- 枚举
- 注解
-
属性赋值
定义了属性,在使用时需要给属性赋值:
- 如果定义属性时,使用
default关键字给属性默认初始化值,则使用注解时,可以不必需赋值 - 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。
- 数组赋值时,值使用{}包裹,如果数组只有一个值,则{}可以省略
自定义注解的步骤
用
@interface定义注解public @interface Report{ }添加参数、默认值
把最常用的参数定义为public @interface Report{ int type() default 0; String level() default "info"; String value() default ""; }value(),推荐所有参数都尽量设置默认值。元注解
用于描述注解的注解
- 如果定义属性时,使用
@Target:描述注解能够作用的位置
- 类或接口:
ElementType.TYPE; - 字段:
ElementType.FIELD; - 方法:
ElementType.METHOD; - 构造方法:
ElementType.CONSTRUCTOR; - 方法参数:
ElementType.PARAMETER。
- 类或接口:
- @Retention:描述注解被保留的阶段
描述
- 仅编译期(只在.java代码文件中):
RetentionPolicy.SOURCE; - 仅class文件(只在.class文件中,不会加载到JVM):
RetentionPolicy.CLASS; - 运行期(保留到class文件中,并被JVM读取到,运行时可以通过反射访问):
RetentionPolicy.RUNTIME。 - 如果
@Retention不存在,则该Annotation默认为RetentionPolicy.CLASS
