概述、自定义注解

注解(Annotation):是Java代码里的特殊标记,比如@Override、@Test等,作用是让给其他程序根据注解信息决定怎么执行程序,

注解可以用在类、构造器、方法、成员变量、参数等位置上。

自定义注解

注解_System

注解_System_02

注解_Test_03

元注解

修饰注解的注解

Target可以在括号中多声明几个位置。

注解_Test_04

注解的解析

注解_Test_05

import com.lzk.test.Demo;
import com.lzk.test.MyTest4;
import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Arrays;

public class test {
   @Test
public void parseMethod() throws Exception {
    // 1. 先得到Class对象
    Class c = Demo.class;
    Method m = c.getDeclaredMethod("test1");

    // 2. 解析方法上的注解
    if (m.isAnnotationPresent(MyTest4.class)) {
        MyTest4 myTest4 = m.getDeclaredAnnotation(MyTest4.class);
        System.out.println(myTest4.value());
        System.out.println(myTest4.aaa());
        System.out.println(Arrays.toString(myTest4.bbb()));
    }
}

}

注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest4 {
    String value();
    double aaa() default 100;
    String[] bbb();
}

Demo类

@MyTest4(value = "蜘蛛精", aaa = 99.5, bbb = {"至尊宝", "马"})

public class Demo {

    @MyTest4(value = "孙悟空", aaa = 199.9, bbb = {"唐僧", "沙和尚"})
    public void test1() {
        // 方法实现
    }
}

应用场景

注解_System_06

public class Demo {

    //@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 {
    Demo a = new Demo();
    // 1. 得到Class对象
    Class c = Demo.class;

    // 2. 提取这个类中的全部成员方法
    Method[] methods = c.getDeclaredMethods();

    // 3. 遍历这个数组中的每个方法对象,看方法上是否存在@MyTest注解,存在就触发该方法运行
    for (Method method : methods) {
        if (method.isAnnotationPresent(MyTest.class)) {
            // 说明当前方法上存在@MyTest,被检测方法法执行。
            method.invoke(a);
        }
    }
}



}


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {

}