一、作用
用来对程序进行解释说明的。
二、常见的注解
@Override 重写/实现
@Deprecated 过时的
@SuppressWarnings 抑制警告
元注解:
@Target:(ElementType)定义这个当前注解可以修饰哪些内容(方法?类?属性?构造器?临时变量?)
@Retention:(RetentionPolicy)注解在什么阶段下生效
- SOURCE: 源码阶段
- CLASS:字节码阶段
- RUNTIME: 运行时阶段,我们一般用的就是这个阶段。
@Documented:生成doc说明文档的时候是否显示
@Inherited: 这个注解是否可以被继承
三、自定义一个不带参数的注解
下面是定义不带参数注解的代码片
@Target({ElementType.TYPE , ElementType.METHOD,ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnnotion {
}
四、定义带参数的注解
-
String value() ;
-
String 表示参数的类型
-
value表示的参数名
-
当参数叫value的时候,可以省略
@MyAnnotion(value = "seven")
-
如果定义了多个参数,则多个参数值之间用逗号隔开
-
参数也可以通过default关键字来定义默认值
-
参数类型也可以定义为数组,数组值给的时候是用{}括起来
-
下面是定义带参数注解的代码片
@Target({ElementType.TYPE , ElementType.METHOD,ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface MyAnnotion {
// 参数类型 参数名
String value() ;
int age() default 18 ;
String [] hobby() ;
}
下面是测试类代码片
public class Person {
@MyAnnotion(value = "seven" ,hobby = {"game","study","sleep"})//给注解赋值
public String name ;
public String password ;
public void study(){
System.out.println("好好学习,天天向上。");
}
}
五、通过反射获取注解的参数
Person p = new Person();
//1.获取字节码文件Class
Class clazz = Person.class ;
//2.获取对象p的属性
Field nameField = clazz.getDeclaredField("name");
//3.获取这个属性对应的注解
MyAnnotion myAnnotion = nameField.getDeclaredAnnotation(MyAnnotion.class);
//4.获取注解里面配置的参数值
String nameValue = myAnnotion.value();
int age = myAnnotion.age();
String [] hobby = myAnnotion.hobby();
System.out.println(nameValue);//输出参数值
nameField.setAccessible(true);
//5.将注解的参数值传入对象的属性
nameField.set(p,nameValue);
System.out.println(p);//输出对象的属性值
六、注解参数的类型一共可以定义哪些
- 基本数据类型(8种)
- String
- Class
- 枚举
- 注解
- 以上几种类型组成的数组