概述、自定义注解
注解(Annotation):是Java代码里的特殊标记,比如@Override、@Test等,作用是让给其他程序根据注解信息决定怎么执行程序,
注解可以用在类、构造器、方法、成员变量、参数等位置上。
自定义注解
元注解
修饰注解的注解
Target可以在括号中多声明几个位置。
注解的解析
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() {
// 方法实现
}
}
应用场景
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 {
}