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的主要内容,如果未能解决你的问题,请参考以下文章