## 基本语法
使用@Test对testExcute()方法进行注解,该注解本身不做任何事情,但是编译器要确保在其构造路径上必须有@Test注解的定义。例子中通过反射机制来运行testExecute()方法的工具。
package annotations;
import net.mindview.atunit.*;
public class Testable{
public void execute(){
System.out.println("Executing..");
}
@Test void testExecute(){
execute();
}
}
被注解的方法与其他的方法没有什么区别,在上面的例子中,注解@Test可以与任何修饰符共同作用与方法,例如public,static或者是void。
定义注解
看看@Test的注解类:
package net.mindview.atunit;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test{};
注解类其实是一个空的接口,在定义注解时,会需要一些元注解(meta-annotation),如@Target和@Retention。
- @Target: 用来定义你的注解将应用于什么地方(打比方是一个方法或者是一个域)。
- @Retention: 用来定义该注解在哪一个级别可用,在源码中(SOURCE),类文件(CLASS)或者运行时(RUNTIME)。
网上记载: 在注解中,一般都会包含一些元素以表示某些值,当分析处理注解时,程序或者是工具可以利用这些值。注解的元素看起来像接口的方法,唯一的区别是你可以为其指定默认值。没有元素的注解称为 “标记注解”,例如上面的@Test。
下面是一个简单的注解,我们可以用它来跟踪一个项目中的用例,如果一个方法或一组方法实现了某个用例的需求,那么程序员可以为此方法加上该注解。
import java.lang.annotation;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase{
public int id();
public String description() default "no description";
}
注意,id和description类似方法定义。由于编译器会对id进行类型检查,因此将用例文档的追踪数据库与源码相关联是可靠的。description元素有一个default值,如果在注解某个方法时没有给出description的值,则该注解的处理器就会使用此元素的默认值。
在下面的类中三个方法被注解为用例:
import java.util.*;
public class PassworUtils{
@UseCase(id=47,description = "Passwords must contain at least one numeric")
public boolean validatePassword(String password){
return (passwor.matches("\\w*\\d\\w*"));
}
@UseCase(id = 48)
public String encryptPassword(String password){
return new StringBuilder(password).reverse().toString();
}
@UseCase(id =49,description = "New passwords can't equal previously used ones")
public boolean checkForNewPassword(
List<String>prevPasswords,String password
){
return !prevPasswords.contains(password);
}
}
注解的元素在使用时表现为名一值对的形式,并需要置于@UseCase声明之后的括号内。在encryptPassword()方法的注解中,并没有给出description元素的值,因此,在UseCase的注解处理器分析这个类时会使用该元素的默认值。
元注解
名称 | 作用 |
---|---|
@Target | 表示该注解可以用于什么地方。可能的ElementType参数包括包括: CONSTRUTOR: 构造器的声明。FIELD:域声明(包括enum实例)。LOCAL_VARABLE: 局部变量声明。METHOD:方法声明。PACKAGE:包声明。PARAMETER:参数声明。TYPE:类,接口(注解类型)或enum声明 |
@Retention | 表示需要在什么级别保存该注解信息。可选的RetentionPolicy参数包括:SOURCE: 注解将被编译器丢弃。CLASS:注解在class文件中用,但会被jvm丢弃。RUNTIME: vm运行将在运行期也保留注解,因此可以通过反射机制读取注解的信息。 |
@Documented | 将此注解包含在Javadoc中 |
@Inherited | 允许子类继承父类中的方法 |
很多时候,我们主要是定义自己的注解,并编写自己的处理器来处理他们。