Last active
August 29, 2015 14:00
-
-
Save ZoeyYoung/11135967 to your computer and use it in GitHub Desktop.
《Thinking In Java》注解定义、使用与编写注解处理器 简例
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package annotations; | |
//: annotations/PasswordUtils.java | |
// 使用注解 | |
import java.util.*; | |
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't equal previously used ones") | |
public boolean checkForNewPassword(List<String> prevPasswords, | |
String password) { | |
return !prevPasswords.contains(password); | |
} | |
} ///:~ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package annotations; | |
//: annotations/UseCase.java | |
// 定义注解 | |
import java.lang.annotation.*; | |
@Target(ElementType.METHOD) | |
@Retention(RetentionPolicy.RUNTIME) | |
public @interface UseCase { | |
public int id(); | |
public String description() default "no description"; | |
} ///:~ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package annotations; | |
//: annotations/UseCaseTracker.java | |
// 注解处理器 | |
import java.lang.reflect.*; | |
import java.util.*; | |
public class UseCaseTracker { | |
public static void trackUseCases(List<Integer> useCases, Class<?> cl) { | |
for (Method m : cl.getDeclaredMethods()) { | |
UseCase uc = m.getAnnotation(UseCase.class); | |
if (uc != null) { | |
System.out.println("Found Use Case:" + uc.id() + " " | |
+ uc.description()); | |
useCases.remove(new Integer(uc.id())); | |
} | |
} | |
for (int i : useCases) { | |
System.out.println("Warning: Missing use case-" + i); | |
} | |
} | |
public static void main(String[] args) { | |
List<Integer> useCases = new ArrayList<Integer>(); | |
Collections.addAll(useCases, 47, 48, 49, 50); | |
trackUseCases(useCases, PasswordUtils.class); | |
} | |
} /* Output: | |
Found Use Case:47 Passwords must contain at least one numeric | |
Found Use Case:48 no description | |
Found Use Case:49 New passwords can't equal previously used ones | |
Warning: Missing use case-50 | |
*///:~ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment