注解Annotation
什么是注解
注解是用来修饰类中的成员信息的,例如 @Test ,@override就是注解的一种,注解就像学校的盖章一样,当盖章盖在了毕业证书上,那么你才能表示毕业,但是当你不毕业的时候压根就不需要他(没有赋予盖章的意义)
所以反应到程序中,注解贴在程序元素上,想要拥有一些功能,必须要有对应的角色参与
- 注解本身
- 被贴的程序元素
- 第三方程序(使用反射给注释赋予功能)
元注解
注解要想拥有功能,首先需要被元注解所赋予
元注解:在定义注解的时候用来贴在注解上的注解,用来限定注解的用法
1.Target
Target表示注解可以贴在那些位置(类,方法,构造器等),封装在枚举类中
ElementType.TYPE
:只能修饰类,接口,枚举ElementType.METHOD
:只能修饰方法ElementType.FIELD
:只能修饰字段
2.Retention
Retention表示注解可以保存在哪一时期
RetentionPolicy.RUNTIME
:运行期间,一直存在RetentionPolicy.SOURCE
:源码时期,编译之后不存在了RetentionPolicy.CLASS
:字节码时期,运行期间不存在了
注解格式 :
@interface 注解名
定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.TYPE})
public @interface Baby {
String[] value() default "小公主";
// String[] value1() default "小公主";
}
使用格式:@注解名(属性名=属性值,属性名=属性值)
定义类使用自定义注解
@Baby(value ={"pig","gg"})
public class People {
@Baby("猪猪")
public void print(){
}
}
测试类
- 获取自定义注解类
public class AnnotationDemo {
public static void main(String[] args) {
try {
//获取People类的字节码对象
Class<?> aClass = Class.forName("cn.k.anno.People");
//获取自定义注释对象
Baby annotation = aClass.getAnnotation(Baby.class);
System.out.println("annotation = " + annotation);
String[] value = annotation.value();
System.out.println(value[0]);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
- 获取注解方法中的内容
public class AnnotationMethodDemo {
public static void main(String[] args) {
try {
//获取People类的字节码对象
Class<?> aClass = Class.forName("cn.k.anno.People");
//获取方法对象
Method print = aClass.getMethod("print");
//获取自定义的注解对象
Baby annotation = print.getAnnotation(Baby.class);
System.out.println("annotation = " + annotation);
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意
- 注解属性 value当只有一个时,可以省略 注解(“省略了value”)
- 当属性不只有一个时.不可以省略 注解(value =“不能省略”)
- 注解可以有默认值 String[] value default “定义默认值”; (default给属性设置默认值)
- 注解中,抽象方法不叫抽象方法,方法名叫做属性名,方法的返回值是属性值的类型
内置注解
- @override(重写)
- Deprecated(标记已过时)
- SuppressWarings(一直编译器发出的警告)
- Functionallnterface(标记该接口是一个函数接口)