Thinking in Annotation

Posted littlepage

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thinking in Annotation相关的知识,希望对你有一定的参考价值。

Thinking in Java这本书很久前就购买了,打算有时间看一下,因为自己的时间被自己安排的紧张,也没时间看书。黄师傅上次课程讲到了注解的使用和反射的使用,今天打算学习一下注解。该文章参考Thinking in Java的第20章Annotation。

简单介绍

注解为我们代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便的使用这些数据。

内置注解:

JavaSE5内置了3个注解

  • @Override 覆盖超类中的方法,如果不小心拼写错误,或者方法签名对不上覆盖的方法,编译器会发出错误提示
  • @Deprecated 如果程序员使用了注解为它的元素,编译器会发出警告信息
  • @Suppress Warnings 关闭不当的警告信息,在JavaSE5之前版本,也可以使用该注解

除了这三个注解,Java还提供了四种胡姐,负责新注解的创建,我们将稍后学习。

当我们创建描述符合性质的类和接口时,一旦其中包含了重复性的工作,那就可以考虑使用注解来简化与自动化该过程,例如

在EJB中存在很多的额外工作,EJB3.0就是使用注解消除了它们。

 

基本语法

编译器要确保其构造路径上必须有@Test注解的定义,我们可以创建一个通过反射机制来运行testExecute()方法的工具。

package littlepage.annotation.test1;

public class Testable 
    public void execute()
        System.out.println("Executing....");
    
    @Test void testExecute()execute();

备注接的方法与其他方法没有区别,在这个例子中,注解@Test可以与任何修饰符作用于方法,例如public、static或者void。从语法角度看,注解的使用方式几乎与修饰符使用一模一样。

package littlepage.annotation.test1;

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

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test 

除了@符号以外,@Test的定义很像一个空的接口。定义注解,你需要一些元注解(meta-annotation),如@Target和@Retention。@Target用来定义你的注解将用于什么地方(例如一个方法或者一个域),@Retention用来定义注解在哪一个级别可用,在源码中(Source),类文件中(Class)或者运行时(Runtime)

在注解中,一般会包含一些元素以某些值。当分析处理注解时,程序或者工具可利用这些值。注解的元素看起来很像接口方法,唯一区别是你可以用为其指定默认值。

没有元素的注解称为标记注解,例如上面的@Test。

 

下面死一个简单的注解,我们可以使用它来跟踪项目用例。

package littlepage.annotation.test1;

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

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase 
    public int id();
    public String description() default  "no description";

注意,id和description类似方法的定义,由于便要一起会对id进行类型检查,因此将用例文档追踪数据库与源代码的关联是可靠的。description元素有一个默认值,如果注解某方法没有给出description的值,那么处理器会使用该元素默认值。

 

下面一个类中有三个方法被注解的用例

package littlepage.annotation.test1;

import java.util.List;

public class PasswordUtils 
    @UseCase(id=47,description = "Password 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‘t equal previously used ones")
    public boolean checkForNewPassword(List<String> prevPasswords,String password)
        return !prevPasswords.contains(password);
    

 

以上是关于Thinking in Annotation的主要内容,如果未能解决你的问题,请参考以下文章

Thinking in Java

Thinking in React(翻译)

Thinking in java 16/3/5

Thinking in java 16/3/6

thinking in java ----reading note

Thinking in Java