1import java.lang.annotation.Documented; 2import java.lang.annotation.ElementType; 3import java.lang.annotation.Retention; 4import java.lang.annotation.RetentionPolicy; 5 6import javax.annotation.MatchesPattern; 7import javax.annotation.meta.TypeQualifier; 8import javax.annotation.meta.TypeQualifierValidator; 9import javax.annotation.meta.When; 10 11@Documented 12@TypeQualifier 13@MatchesPattern("[0-9]{16}") 14@Retention(RetentionPolicy.RUNTIME) 15public @interface CreditCardNumber { 16 class Checker implements TypeQualifierValidator<CreditCardNumber> { 17 18 public When forConstantValue(CreditCardNumber annotation, Object v) { 19 if (!(v instanceof String)) 20 return When.NEVER; 21 String s = (String) v; 22 if (LuhnVerification.checkNumber(s)) 23 return When.ALWAYS; 24 return When.NEVER; 25 } 26 } 27} 28