1.注解
- 就是lava代码里的特殊标记,比如:@Override、@Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序。
- 注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。
如下@Override所示:
2.自定义注解
就是自己定义注解
特殊属性名: value
如果注解中只有一个value属性,使用注解时,value名称可以不写!!
自定义注解的基本使用:
定义自定义注解:
public @interface Mytest { String aaa(); boolean bbb() default true; String[] ccc(); }
使用上面的自定义注解:
@Mytest(aaa="aaa",bbb = false,ccc={"a","b"}) public class Annotation_test { }
3.注解的原理
- 注解本质是一个接口,Java中所有注解都是继承了Annotation接口的
- @注解(其实就是一个实现类对象,实现了该注解以及Annotation接口
4.元注解
指的是:修饰注解的注解
有以下两个常用元注解:
元注解的基本使用:
@Target({ElementType.METHOD,ElementType.TYPE})//当前被修饰的注解只能在类,接口,成员方法中使用 @Retention(RetentionPolicy.RUNTIME)//控制下面的注解一直保留到运行时 public @interface Mytest { }
5.什么是注解的解析?
- 就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来。
如何解析注解?
- 指导思想:要解析谁上面的注解,就应该先拿到谁
- 比如要解析类上面的注解,则应该先获取该类的Class对象,再通过Class对象解析其上面的注解
- 比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解
- Class、Method、Field,Constructor、都实现了AnnotatedElement接口,它们都拥有解析注解的能力
6.解析注解的案例
解析注解的案例,具体需求如下:
1.定义注解MyTest4,要求如
- 包含属性: String value()
- 包含属性: double aaa(),默认值为 100
- 包含属性: Stringl] bbb()
- 限制注解使用的位置:类和成员方法上
- 指定注解的有效范围:一直到运行时
2.定义一个类叫:Demo,在类中定义一个test1方法,并在该类和其方法上使用MyTest4注解
3.定义AnnotationTest3测试类,解析Demo类中的全部注解。
定义注解:
@Target({ElementType.METHOD,ElementType.TYPE})//当前被修饰的注解只能在类,接口,成员方法中使用 @Retention(RetentionPolicy.RUNTIME)//控制下面的注解一直保留到运行时 public @interface Mytest4 { String value(); double aaa() default 100; String[] bbb(); }
定义类Demo
@Mytest4(value = "value",aaa = 99.5,bbb={"a","b","c"}) public class Demo { @Mytest4(value = "value2",aaa = 99.9,bbb={"a","b","c"}) public void test(){ } }
定义AnnotationTest3测试类
public class AnnotationTest3 { public void parseClass(){ //1.先得到Class对象 Class c= Demo.class; //2.解析类上的注解 //判断类上是否包含某个注解 if(c.isAnnotationPresent(Mytest4.class)){ Mytest4 mytest4=(Mytest4) c.getDeclaredAnnotation(Mytest4.class); System.out.println(mytest4.value()); System.out.println(mytest4.aaa()); System.out.println(Arrays.toString(mytest4.bbb())); } } }