注解的介绍
Java中总共有五大引用数据类型:类、数组、接口、枚举、注解。其中注解是在jdk1.5版本中加进来的特性,和类,接口,枚举是同一个层次的。
注解应用:
- 说明:一般用来对代码进行说明,方便生成doc文档(API文档)
- 检查:检查代码是否符合条件@Override(检查重写方法) @FunctionalInterface(检查函数式接口)
- 分析:对代码进行分析,起到了代替配置文件的作用。
JDK中的常用注解
@Override
:检测此方法是否为重写方法,支持父类、接口的方法重写
@Deprecated
:表明此方法已经过时,不推荐使用,如果调用过时的方法,方法上会有横线,但是能用。
public class Person {
private String name;
public Integer age;
@Deprecated
void test() {
System.out.println("hhhhhhhh");
}
}
@SuppressWarnings
:用来消除警告 @SuppressWarnings(“all”) ,all表示消除所有警告。
例如不指定ArrayList的泛型会警告
加上@SuppressWarnings("all")
就不警告了。
自定义注解及属性的定义格式
注解属性,其实本质上是抽象方法。但是我们按照属性来理解容易理解,因为到时候使用注解的时候,需要用=为其赋值。
自定义注解:
public @interface 注解名{
XXXXXXX
}
定义属性:增强注解的作用
数据类型 属性名()
:此属性没有默认值,需要在使用注解的时候为其赋值。
数据类型 属性名() default 值
:此属性有默认值,如果有需要,还可以二次赋值。
注解中能定义8种基本类型:
String类型、class类型、枚举类型、注解类型、以及以上类型的一维数组。
public @interface Car {
String carname();//品牌
String[] carParts();//车零件
int price();//价格
int count() default 66;//数量
}
注解使用
注解可以在类上使用,方法上使用,成员变量上使用,局部变量上使用,参数位置使用等。
使用格式:
@注解名(属性名 = 值,属性名 = 值...)
属性中有数组的情况:
@注解名(属性名 = {元素1,元素2...})
数量count有默认值所以可以不用指定。
注解注意事项:
- 空注解可以直接使用,空注解就是注解中没有任何的属性
- 不同的位置可以使用一样的注解,但是同样的位置不能使用一样的注解
- 使用注解时,如果此注解中有属性,注解中的属性一定要赋值,如果有多个属性,用","隔开如果注解中的属性有数组,使用{ }
- 如果注解中的属性值有默认值,那么我们不必要写,也不用重新赋值,反之必须写上。
- 如果注解中只有一个属性,并且属性名叫value,那么使用注解的时候,属性名不用写,直接写值(包括单个类型,还包括数组)
public @interface Car {
String value();
}
想要解析注解我们需要先使用元注解来管理注解能否在内存中出现,所以我们先介绍元注解
元注解
元注解就是管理注解的注解,它能够
- 控制注解的使用位置:控制注解是否能在类上、方法上、构造上使用。
- 控制注解的生命周期(加载位置):控制注解是否能在源码中、是否能在class文件中、是否能在内存中出现
@Target:控制注解的使用位置
ElementType[] value();
:ElementType是一个枚举,里面的成员可以类名直接调用。
ElementType中的成员包括:
- TYPE:控制注解能使用在类上
- FIELD:控制注解能使用在属性上
- METHOD:控制注解能使用在方法上
- PARAMETER:控制注解能使用在参数上
- CONSTRUCTOR:控制注解能使用在构造上
- LOCAL_VARIABLE:控制注解能使用在局部变量上
@Retention:控制注解的生命周期(加载位置)
RetentionPolicy value();
:RetentionPolicy是一个枚举,里面的成员可以类名直接调用
RetentionPolicy中的成员包括:
- SOURCE:控制注解能在源码中出现(默认)
- CLASS:控制注解能在class文件中出现
- RUNTIME:控制注解能在内存中出现
注解的解析
注解的解析就是将注解中的属性值获取出来,涉及到的接口为AnnotatedElement接口
实现类:AccessibleObject、Class、Constructor、Executable、Field、Method、Package、Parameter。
解析过程:先判断指定位置上有没有使用指定的注解。如果有,获取指定的注解,获取注解中的属性值。
boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
:判断指定位置上有没有指定的注解
getAnnotation(Class<T> annotationClass)
:获取指定的注解,返回值类型为获取的注解类型
public class Main {
public static void main(String[] args) throws Exception {
//1.获取BookShelf的class对象
Class<Factory> factoryClass = Factory.class;
//2.判断bookShelf上有没有Book注解
boolean b = factoryClass.isAnnotationPresent(Car.class);
//3.判断,如果b为true,就获取
if (b) {
Car car = factoryClass.getAnnotation(Car.class);
System.out.println("品牌 = " + car.carname());
System.out.println(Arrays.toString(car.carParts()));
System.out.println("价格 = " + car.price());
System.out.println("数量 = " + car.count());
}
}
}
标签:控制,Java,自定义,public,使用,注解,class,属性
From: https://blog.csdn.net/weixin_45797022/article/details/140398361