1. 程式人生 > >java @Target 自定義註解 校驗引數是否為空

java @Target 自定義註解 校驗引數是否為空

第一步自定義類
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ParamsRequired {
    /**
     * 必須引數
     * @return
     */
    boolean requrie() default true;
}
import org.apache.commons.lang3.StringUtils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Date;

public class BasePojo {

    public boolean validate() throws Exception {

        Field[] fields = this.getClass().getDeclaredFields();

        for (Field field : fields) {
            if(field.isAnnotationPresent(ParamsRequired.class)) {
                ParamsRequired paramsRequired = field.getAnnotation(ParamsRequired.class);
                if(paramsRequired.requrie()) {
                    // 如果型別是String
                    if (field.getGenericType().toString().equals(
                            "class java.lang.String")) { // 如果type是類型別,則前面包含"class ",後面跟類名
                        // 拿到該屬性的gettet方法
                        /**
                         * 這裡需要說明一下:他是根據拼湊的字元來找你寫的getter方法的
                         * 在Boolean值的時候是isXXX(預設使用ide生成getter的都是isXXX)
                         * 如果出現NoSuchMethod異常 就說明它找不到那個gettet方法 需要做個規範
                         */
                        Method m = this.getClass().getMethod(
                                "get" + getMethodName(field.getName()));

                        String val = (String) m.invoke(this);// 呼叫getter方法獲取屬性值
                        if(StringUtils.isEmpty(val)) {
                            throw new Exception(field.getName() + " 不能為空!");
                        } else if (val != null) {
                            System.out.println("String type:" + val);
                        }

                    } else if (field.getGenericType().toString().equals(
                            "class java.lang.Integer")) { // 如果type是類型別,則前面包含"class ",後面跟類名
                        Method m = this.getClass().getMethod(
                                "get" + getMethodName(field.getName()));

                        Integer val = (Integer) m.invoke(this);// 呼叫getter方法獲取屬性值
                        if(val==null) {
                            throw new Exception(field.getName() + " 不能為空!");
                        } else if (val != null) {
                            System.out.println("Integer type:" + val);
                        }

                    }else if (field.getGenericType().toString().equals(
                            "class java.util.Date")) {
                        Method m = this.getClass().getMethod(
                                "get" + getMethodName(field.getName()));

                        Date val = (Date) m.invoke(this);// 呼叫getter方法獲取屬性值
                        if(val==null) {
                            throw new Exception(field.getName() + " 不能為空!");
                        } else if (val != null) {
                            System.out.println("Date type:" + val);
                        }

                    }else if (field.getGenericType().toString().equals(
                            "class java.math.BigDecimal")) {
                        Method m = this.getClass().getMethod(
                                "get" + getMethodName(field.getName()));

                        BigDecimal val = (BigDecimal) m.invoke(this);// 呼叫getter方法獲取屬性值
                        if(val==null) {
                            throw new Exception(field.getName() + " 不能為空!");
                        } else if (val != null) {
                            System.out.println("BigDecimal type:" + val);
                        }

                    }else if (field.getGenericType().toString().equals(
                            "class java.lang.Double")) {
                        Method m = this.getClass().getMethod(
                                "get" + getMethodName(field.getName()));

                        Double val = (Double) m.invoke(this);// 呼叫getter方法獲取屬性值
                        if(val==null) {
                            throw new Exception(field.getName() + " 不能為空!");
                        } else if (val != null) {
                            System.out.println("double type:" + val);
                        }

                    }else if (field.getGenericType().toString().equals(
                            "class java.lang.Float")) {
                        Method m = this.getClass().getMethod(
                                "get" + getMethodName(field.getName()));

                        Float val = (Float) m.invoke(this);// 呼叫getter方法獲取屬性值
                        if(val==null) {
                            throw new Exception(field.getName() + " 不能為空!");
                        } else if (val != null) {
                            System.out.println("float type:" + val);
                        }

                    }
                }

            }
        }
        return  true;
    }

    /**
     * 把一個字串的第一個字母大寫、效率是最高的、
     */
    private String getMethodName(String fildeName) throws Exception{
        byte[] items = fildeName.getBytes();
        items[0] = (byte) ((char) items[0] - 'a' + 'A');
        return new String(items);
    }


}
import java.math.BigDecimal;
import java.util.Date;

public class Text extends BasePojo {


    @ParamsRequired
    private String name;

    @ParamsRequired
    private Integer age;

    @ParamsRequired
    private Date createTime;

    @ParamsRequired
    private Double adouble;
    @ParamsRequired
    private Float afloat;
    @ParamsRequired
    private BigDecimal decimal;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Double getAdouble() {
        return adouble;
    }

    public void setAdouble(Double adouble) {
        this.adouble = adouble;
    }

    public Float getAfloat() {
        return afloat;
    }

    public void setAfloat(Float afloat) {
        this.afloat = afloat;
    }

    public BigDecimal getDecimal() {
        return decimal;
    }

    public void setDecimal(BigDecimal decimal) {
        this.decimal = decimal;
    }
}

 public static void main(String[] args){        

  Text req = new Text();
   req.setName("張三");
    req.setAge(1);
req.setDecimal(new BigDecimal(12212));
req.setCreateTime(new Date());

             }