注解是代码的附属信息,它遵循一个基本原则:注解不能直接干扰程序代码的运行,无论增加或删除注解,代码都能正常运行。java语言解释器会忽略这些注解,而由第三方工具 负责对注解进行处理。第三方工具可以利用代码中的注解间接控制程序代码的运行,它们通过java反射机制读取注解的信息,并根据这些信息更改目标程序的逻辑,而这就是SpringAOP对@AspectJ提供支持所采取的方法。
案例
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface NeedTest {
boolean value() default true;
String description()default "LOW";
}
public class ForumService {
@NeedTest(value = true)
public void deleteForumById(int fornmId){
System.out.println("delte forum "+fornmId);
}
}
Class classz = ForumService.class;
Method[]methods = classz.getDeclaredMethods();
for (Method method:methods) {
NeedTest needTest = method.getAnnotation(NeedTest.class);
if(needTest!=null)
{
if(needTest.value() == true)
{
System.out.println(method.getName()+"() need Test");
}
else {
System.out.println(method.getName()+"() no need Test");
}
}
}
注解的限制:
- 成员以无入参无抛出异常的方式声明。
- 可以通过default为成员指定一个默认值。
- 成员类型是受限的,合法的类型包括原始类型和封装类型。
@Retention
@Retention表示这个注解的保留期限。
- Retention.SOURCE 注解将被编译器丢弃,只保存在源码中。
- Retention.CLASS 注解在class文件中可用,但类加载器加载字节码文件时不会将注解加载到JVM中,也即运行期不能获取注解信息。
- Retention.RUNTIME 将在运行期间保留注解,因此可以通过反射机制读取注解的信息。
@Target
@Target注解表示这个注解的应用目标
- CONSTRUCTOR:构造器的声明
- FIELD:域声明(包括enum实例)
- LOCAL_VARIABLE:局部变量声明
- METHOD:方法声明
- PACKAGE:包声明
- PARAMETER:参数声明
- TYPE:类、接口(包括注解类型)或enum声明
网友评论