注解
一种标记,用来给计算机看的。
元注解
用来标注“普通注解”的注解。
Target
指定可以标注的目标或者可以标注在哪个上面。
-
ElementType.TYPE
类 -
ElementType.FIELD
属性 -
ElementType.METHOD
方法 -
ElementType.CONSTRUCTOR
构造器 -
…
Retention
保存的地方。
RetentionPolicy.SOURCE
保存在源文件RetentionPolicy.CLASS
保存在.class文件RetentionPolicy.RUNTIME
保存在.class文件并可以被反射读取
内置注解
Override
只能放在方法上,判断该方法是否重写父类的方法。
Deprecated
可以放在类、方法、字段、构造器等上面,表示(这个已过时,不建议使用),但如果使用也可以正常使用。
编写方式
//可以加元注解,也可以不加
public @interface 注解名{
//可以有属性
属性类型 属性名();
//属性类型可以是:
// 基本数据类型、String、枚举、Class和相应的数组。
String value();
int id() default 1;//可以写默认值
double[] nums();
}
使用方法
在相应的代码上加注解。
//注解中的参数一般是(属性名=值,属性名=值)
@MyAnnotation(value = "zhangsan ")//只有value
@MyAnnotation("zhangsan ")//只有value,可以不写value
@MyAnnotation()//只有id,不写值默认为1
@MyAnnotation(nums = {12.2,576.2})//只有数组nums
@MyAnnotation(nums = 12.2)//只有数组nums且数组的值只有一个,可以省略花括号
void run(){
}
- 当属性名为value,并且只有一个属性名时,value可以不写(省略)。
- 如果属性有默认值时,参数可以不写。
- 如果属性是数组且数组的值只有一个时,可以省略花括号。
通过反射获取注解
获取注解的Retention必须是RUNTIME的。
public class MyAnnotationTest1 {
@MyAnnotation(value = "zhangsan",i=2)
void run(){}
}
- 要获取注解上的值,先要获取注解
- 要获取注解,先要获取方法,因为该注解是在方法上的。
- 要获取方法,先获取类。
//获取类
Class aClass = Class.forName("base.注解.MyAnnotationTest1");
//获取类的run方法
Method method=aClass.getDeclaredMethod("run");
//如果run方法上有MyAnnotation类型的注解
if(method.isAnnotationPresent(MyAnnotation.class)){
//获取注解
MyAnnotation myAnnotation=method.getAnnotation(MyAnnotation.class);
//获取注解的值
String value = myAnnotation.value();
System.out.println(myAnnotation.i());//2
System.out.println(value);//zhangsan