import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @Override
* 表示该方法可以覆盖超类中的方法
* @Deprecated
* 使用了注解为他的元素编译器发出警告,因为此方法注解的代码为不赞成使用的代码,或者被弃用的代码
* @SuppressWarnings
* 关闭不当编译器的警告信息
* @Target
* 表示该注解可以用在什么地方,可能的ElementType参数有:
* CONSTRUCTOR:构造器的声明
* FIELD:域的声明,包括enum的实例,也就是普通的成员变量?
* METHOD:方法声明
* PACKAGE:包声明
* PARAMETER:参数声明
* TYPE:类、接口(包括注解类型)或者enum的声明
* @Retention
* 表示需要在什么级别保存该注解信息,可选的RetentionPolicy参数包括:
* SOURCE:注解将被编译器丢弃
* CLASS:注解在class文件中可用,但会被VM丢弃
* RUNTIME:VM将在运行期间保留注解,因此可以通过反射读取注解信息
* @Document
* 将注解包含在java doc中
* @Inherited
* 允许自雷继承父类中的注解
*/
public class Main{
public static void main(String[] args) {
System.out.println("----beginning of test");
List useCases=new ArrayList<>();
Collections.addAll(useCases,47,48,49,50);
trackUseCases(useCases,PasswordUtils.class);
}
public static void trackUseCases(List useCases,Class> cl){
for (Method m:cl.getDeclaredMethods()){
//获得注解的对象
UseCase.UseCases uc=m.getAnnotation(UseCase.UseCases.class);
if (m.isAnnotationPresent(UseCase.UseCases.class)){
System.out.println("Found use cases:"+uc.id()+" "+uc.description());
useCases.remove(new Integer(uc.id()));
}
}
for (int i:useCases){
System.out.println("Warning:Missing use cases-"+i);
}
}
}
class UseCase{
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UseCases{
public String id();
public String description() default "no description";
}
}
class PasswordUtils{
@UseCase.UseCases(id="47",description = "Password must contain at least one numeric")
public boolean validataPassword(String passWord){
return passWord.matches("\\w*\\d\\w");
}
public String encryptPassword(String password){
return new StringBuilder(password).reverse().toString();
}
}