注解

什么是注解

通过反编译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该方法需要传一个对象,随便传一个都可以

            }
        }

    }
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容