Validation with Annotation
qiita.com
をリーダーに見せてみたら答え(ページ)を書き写すのではなくて自分でゼロから書いてみたら?といわれたので書いてみました。
それなりに動いてくれました。やったね!
答え合わせしてみると大筋同じだったけど、サイトのほうは値がnullのときどうするの?という弱点があることもわかりました。
参照:
http://www.ne.jp/asahi/hishidama/home/tech/java/reflection.html
http://www.ne.jp/asahi/hishidama/home/tech/java/annotation.html
package bean; import common.Validation; public class Customer { public Customer(String name, String tel, Integer number) { this.name = name; this.tel = tel; this.number = number; } @Validation(expression = ".{1,5}") private String name; @Validation(expression = "[0-9]{10,11}") private String tel; @Validation(expression = "[0-9]{3}") private Integer number; public String address; } package common; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Validation { /** * expression is regexp pattern to use at validate * * @return */ String expression() default ""; } package main; import java.lang.reflect.Field; import bean.Customer; import common.Validation; public class Main { public static void main(String[] args) { Customer c1 = new Customer("12345", "1234567890", 123); boolean valid = isValid(c1); System.out.println(valid); Customer c2 = new Customer("12345", null, 123); boolean valid2 = isValid(c2); System.out.println(valid2); Customer c3 = new Customer("12345", null, null); boolean valid3 = isValid(c3); System.out.println(valid3); } /** * validationメソッド * * @param obj * 対象オブジェクト * @return */ public static boolean isValid(Object obj) { boolean valid = true; Field[] fields = obj.getClass().getDeclaredFields(); for (Field f : fields) { f.setAccessible(true); if (null != f.getAnnotation(Validation.class)) { String expression = f.getAnnotation(Validation.class).expression(); if (expression.equals("")) { continue; } else { String value = null; try { if (f.get(obj) != null) { value = f.get(obj).toString(); } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } if (value != null && value.matches(expression)) { System.out.println("check:" + f.getName().toString() + "->OK"); } else { System.out.println("check:" + f.getName().toString() + "->NG"); valid = false; } } } } return valid; } }
check:name->OK check:tel->OK check:number->OK true check:name->OK check:tel->NG check:number->OK false check:name->OK check:tel->NG check:number->NG false