読者です 読者をやめる 読者になる 読者になる

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