@Test注解的解释示范

 ## 基本语法
   使用@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允许子类继承父类中的方法

很多时候,我们主要是定义自己的注解,并编写自己的处理器来处理他们。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值