第20章注解

1、注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。
2、注解在一定程度上是把元数据与源代码文件结合在一起,而不是保存在外部文档中这一趋势之下所催生的。
3、@Override 表示当前的方法定义将覆盖超类中的方法。如果拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示。
4、@Deprecated 如果使用了注解为它的元素,编译器会发出警告消息。
5、@SuppressWarnings,关闭不当的编译器警告信息。
20.1基本语法
1、注解的使用方式几乎与修饰符的使用一模一样。
20.1.1定义注解 20.1.2 元注解

package com20;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Created by Panda on 2018/5/21.
 */
//三种标准注解 四种元注解
//@Target 用来定义注解将应用于什么地方(例如一个方法或者一个域)
//@Retention 用来定义该注解在哪一个级别可用,在源代码中(SOURCE)、类文件中(CLASS) 或者运行时(RUNTIME)
//@Documented 将此注解包含在Javadoc中
//@Inherited 允许子类继承父类中的注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test{}

20.2编写注解处理器

package com20;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Created by Panda on 2018/5/21.
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
    public int id();
    public String description() default "no description";
}
package com20;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Created by Panda on 2018/5/21.
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase {
    public int id();
    public String description() default "no description";
}
package com20;

import java.util.List;

/**
 * Created by Panda on 2018/5/21.
 */
public class PasswordUtils {
    @UseCase(id=47,description = "Passwords must contain at least one numeric")
    public boolean validatePassword(String password){
        return (password.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 not equal previously used ones")
    public boolean checkForNewPassword(List<String> prevPasswords,String password){
        return !prevPasswords.contains(password);
    }
}

20.2.1注解元素
1、注解元素可用的类型如下:String class enum Annotation 以上类型的数组
20.2.2默认值限制
1、编译器对元素的默认值有些过分挑剔。首先,元素不能有不确定的值。也就是说,元素必须要么具有默认值,要么在使用注解时提供元素的值。
2、对于非基本类型的元素,无论是在源代码中声明时,或是在注解接口中定义默认值时,都不能以null作为其值。
20.2.3生成外部文件
20.2.4注解不支持继承
1、不能使用关键字extends来继承某个@interface
20.2.5实现注解器
20.3使用apt处理注解
1、注解处理工具apt。Apt被设计为操作Java源文件,而不是编译后的类。默认情况下,apt会在处理完源文件后编译它们。如果在系统构建的过程中会自动创建一些新的源文件,那么这个特性非常有用。事实上,apt会检查新生成的源文件中注解,然后将所有文件一同编译。
20.4将观察者模式用于apt
1、访问者会遍历某个数据结构或一个对象的集合,对其中每一个对象执行一个操作。该数据结构无需有序,而你对每个对象执行的操作,都是特定于此对象的类型。这就将操作与对象解耦,也就是说,可以添加新的操作,而不需向类的定义中添加方法。
20.5基于注解的单元测试
1、单元测试是对类中的每个方法提供一个或多个测试的一种实践,其目的是为了有规律地测试一个类的各个部分是否具备正确的行为。单元测试工具JUnit
2、对每一个单元测试而言,@Unit都会用默认的构造器,为该测试所属的类创建出一个新的实例。并在此新创建的对象上运行测试,然后丢弃该对象,以避免对其他测试产生副作用。如果此创建对象导致依赖于类的默认构造器。如果类没有默认构造器,或者新对象需要复杂的构造过程,可以创建一个static方法专门负责构造对象。
移除测试代码。对许多项目而言,在发布的代码中是否保留测试代码并没什么区别,但是在有的情况下,希望将测试代码清除掉,精简发布的程序,或者就是不希望测试代码暴露给客户

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值