- 就是Java代码里的特殊标记,作用是:让其他程序根据注解信息来决定怎么执行程序
- 注意:注解可以用在类上、构造器、方法、成员变量、参数
一、自定义注解
java
/*
自定义注解
*/
public @interface MyTest1 {
String aaa();
boolean bbb() default true;
String[] ccc();
}
特殊属性名:value
java
public @interface MyTest2 {
String value(); //特殊属性
int age() default 23;
}
java
@MyTest1(aaa="xyy",ccc={"HTML", "Java"})
//@MyTest2(value = "swk",age = 1000)
@MyTest2(value = "swk")
public class AnnotationTest1 {
@MyTest1(aaa="cxk",bbb=false,ccc={"Python" , "前端" ,"Java"})
public void test1(){
}
public static void main(String[] args) {
}
}
二、元注解
- 修饰注解的注解
java
@Target({ElementType.TYPE, ElementType.METHOD}) //当前被修饰注解只能用在类、方法上
@Retention(RetentionPolicy.RUNTIME) //控制下面的注解一直保留到运行时
public @interface MyTest3 {
}
三、什么是注解的解析?
- 就是判断类上、方法、成员变量上是否存在注解,并把注解里的内容解析出来
如何解析注解?
注解MyTest4
java
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest4 {
String value();
double aaa() default 100;
String[] bbb();
}
Demo类
java
MyTest4(value = "猪猪侠",aaa = 99.5,bbb = {"超人强","小呆呆"})
public class Demo {
@MyTest4(value = "迷糊老师",aaa = 199.5,bbb = {"菲菲公主","GGBOND"})
public void test1(){
}
}
java
/**
* 目标:掌握注解的解析
*/
public class AnnotationTest3 {
@Test
public void parseClass(){
//1.先得到Class对象
Class<Demo> c = Demo.class;
//2.解析类上的注解
//判断类上是否包含了某个注解
if(c.isAnnotationPresent(MyTest4.class)){
MyTest4 myTest4
= c.getDeclaredAnnotation(MyTest4.class);
System.out.println(myTest4.value());
System.out.println(myTest4.aaa());
System.out.println(Arrays.toString(myTest4.bbb()));
}
}
@Test
public void parseMethod() throws NoSuchMethodException {
//1.先得到Class对象
Class<Demo> 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()));
}
}
}
四、注解应用场景
java
public class AnnotationTest4 {
// @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 InvocationTargetException, IllegalAccessException {
AnnotationTest4 a = new AnnotationTest4();
//启动程序!
//1.得到Class对象
Class<AnnotationTest4> c = AnnotationTest4.class;
//2.提取这个类中的全部成员方法
Method[] methods = c.getDeclaredMethods();
//3.遍历数组,看方法上是否存在@MyTest注解
for (Method method : methods) {
if(method.isAnnotationPresent(MyTest.class)){
//说明当前方法上是存在@MyTest,触发当前方法执行
method.invoke(a);
}
}
}
}
//MyTest注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTest {
}