javaSE5提供了注解。
内置了三种标准注解,以及四种元注解。
标准注解:
- @override 覆盖的方法
- @deprecated 不建议使用的方法
- @SuppressWarnings 关闭不当的警告信息
元注解:专门负责新注解的创建
1.@Target 表示注解可以用于什么地方ElementType
.CONSTRUCTOR:构造器
.Fileld:域声明
.LOCAL_VARIABLE :局部变量声明
.METHOD :方法声明 .PACKAGE :包声明
.parameter :参数声明
.Type: 类,接口(包括注解类型),enum
2.Retention :表示在什么级别保存该信息:
SOURCE,被编译器丢弃
CLASS class文件中存在,但是vm丢弃
runtime vm中也存在,这样就可以使用反射调用了
3.Documented 将此注解包含在javadoc 中
4@Inherited 允许子类继承父类中的注解。
配合其他的使用。
注解元素的类型:
- 所有基本类型 int float
- String
- Class
- enum
- Annotation
6,以上类型的数组
通过5可以发现注解可以嵌套。默认值规则,必须定义。无论是默认值还是使用的时候赋值。但是不能为null。所以我们一般使用空字符串或者负数表示元素的状态
注解定义:使用@interface 类似于接口的定义方式。
//使用位置为方法
@Target(ElementType.METHOD)
//注解保存级别
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCase{
public int id(); //注解的元素,看起来像方法,没有元素的注解称之为标记注解
public String description() default "no description"
}
注解使用:
public class PasswordUtils{
@UseCase(id =12,description ="这是一个测试")//名-值对的形式
public Boolean validatePassword(String password){
return (password.matches("\\w*\\d"));
}
@UserCase(id = 23)
public String encryptPassword(String password){
return new StringBuilder(password.reverse().toString());
}
}
注解如果没有注解处理器,他就和注释没有没有区别。
通过反射使用,相应的注解。也可以当做方法的一部分。
解析:将需要解析的类作为参数传入,通过反射,判断是否存在注解。
创建注解处理器:
public class UserCaseTracker{
public static void trackUserCases(List<Interger>UserCase,Class<?> cl){
for(Method m : cl.getDeclaredMethods()){
UserCase uc = m.getDeclaredMethods();
if(uc != null){
System.out.println("Found Use Case" + uc.id() + uc.description());
}
}
}
}
public class void main(String[] args){
List<Integer> UseCases = new ArrayList<Integer>();
Collections.add(UseCases,47,48,49,50);
trackUserCases(UserCases,PasswordUtils.Class);
}
注解实例: