1.什么是注解? -就是通过一个符号实现一个功能,让开发变得更简单 -每个注解的符号都是提前定义好的 -每个注解的背后都有一个强大的处理程序,处理相关功能 -注解使用的形式:@xxx(属性) 2.常用的注解 -@Override:强制重写注解 -@Test:测试用例注解 -@Deprecated:声名过时注解 -@WebServlet:Servlet注解 -@WebFilter:过滤器注解 3.注解的元注解 -元注解指用于注解的注解 -元注解是用于定义注解 -常用的元注解 @Target:指定注解使用的位置 -注解使用的位置:类、方法、属性、参数、注解 -Target注解定义该注解使用的位置由ElementType枚举指定 -TYPE:类上可用 -FIELD:属性可用 -METHOD:方法可用 -PARAMETER:参数可用 -CONSTRUCTOR:构造器可用 @Retention:指定定义的注解在什么时候起作用 -该注解由RetentionPolicy枚举指定起作用的范围 -SOURCE:源码起作用 -CLASS:字节码上起作用(编译后仍然存在) -RUNTIME:运行期起作用 @Documented:指该注解在生成文档是否可用 4.定义注解 注解中包含"属性" 注解通过@interface来声名
声名一个注解:
package com.xxx.annotation;
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,ElementType.FIELD})//在类和方法、属性上可用
@Retention(RetentionPolicy.RUNTIME)//在运行时起作用
public @interface MyAnnotation {
String name() default ""; //注意:加上默认值后,使用注解时,里面参数的参数根据自己的需求写
int age() default 0;
//定义一个属性
String value() default "";
}
声名注解要由特殊的用途,而现在的这个声名的注解是没有用的,咱们只是写了注解的形式,而下面展示的代码只是使用,但是本身并没有什么作用
package com.xxx.annotation;
@MyAnnotation //定义在类上
public class AnnotationTest {
@MyAnnotation(age = 18,value = "100") //定义在属性上
private String uname;
@MyAnnotation(value = "admin")//定义在方法上
public void test(){
}
}
下面看代码,下面就是获得某一方法上面的所有注解,然后通过注解类型获得方法上定义的具体注解,获得后获得其注解传的参数值,然后获得该参数之后进行加工处理,具体业务,具体分析
package com.xxx.annotation;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ParseAnnotation {
public static void main(String[] args) throws Exception{
//获得类的class对象
Class cla = AnnotationTest.class;
//获得cla中test方法
Method method = cla.getDeclaredMethod("test");
//获得方法的所有注解
Annotation[] annotations = method.getDeclaredAnnotations();
for (Annotation annotation : annotations) {
System.out.println(annotation);
}
//根据注解类型获得方法上定义的具体注解
MyAnnotation declaredAnnotation = method.getDeclaredAnnotation(MyAnnotation.class);
var age = declaredAnnotation.age();
var value = declaredAnnotation.value();
System.out.println(age);
System.out.println(value);
}
}
运行结果: