什么是注解
通过反编译class文件可以看出,注解就是接口,注解中的属性就是接口下面的抽象方法
注解作用
用来标记某个程序(功能),然后让其他程序根据注解信息决定怎么去对待他们
自定义注解
//自定义注解
public @interface MyTest1 {
String name();
boolean a() default true;
int age();
}
public @interface MyTest2 {
String value();
}
使用注解
//自定义注解的使用
@MyTest1(name = "小明",age = 12)
public class Demo1 {
@MyTest2("小刘")
public void eat () {
}
}
元注解
指的是:修饰注解的注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyTest2 {
String value();
}
常见的两个元注解
@Retention(RetentionPolicy.RUNTIME)
作用:声明注解的保留周期
1.SOURCE
只作用在源码阶段,字节码文件不存在
2.CLASS(默认值)
保留到字节码文件阶段,运行阶段不存在
3.RUNTIME(开发常用)
一直保留到运行阶段
@Target(ElementType.METHOD)
作用:声明被修饰的注解只能用在哪些位置
1.TYPE,类,接口
2.FIELD,成员变量
3.METHOD,成员方法
4.PAEAMETER,方法参数
5.CONSTRUCTOR,构造器
6.LOCAL_VARIABLE,局部变量
注解应用场景
模拟junt框架
自定义一个注解MyTest,用来表示哪些方法需要测试,哪些方法>不需要测试,加了@MyTest注解的需要测试,否则不需要测试,
在main函数中通过反射获取到加了注解的方法,通过执行main方>法,带有@MyTest注解的也会跟随者执行
import java.lang.reflect.Method;
public class AnnotationTest {
@MyTest
public void test1(){
System.out.println("test1");
}
@MyTest
public void test2(){
System.out.println("test2");
}
//@MyTest
public void test3(){
System.out.println("test3");
}
//@MyTest
public void test4(){
System.out.println("test4");
}
public static void main(String[] args) throws Exception {
AnnotationTest a = new AnnotationTest();
//启动程序
Class c = AnnotationTest.class;//获取类对象
Method[] methods = c.getDeclaredMethods();//获取类下面的所有方法
//遍历这个数组中的每个方法,看上面是否存在@MyTest注解,存在则执行该方法
for (Method method : methods) {
if (method.isAnnotationPresent(MyTest.class)) {
//说明当前方法上是存在@MyTest注解的,触发当前方法执行
method.invoke(a);//触发该方法,invoke该方法需要传一个对象,随便传一个都可以
}
}
}
}