欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談java反射和自定義注解的綜合應(yīng)用實(shí)例

 更新時(shí)間:2017年09月01日 09:35:01   作者:daochuwenziyao  
本篇文章主要介紹了java反射和自定義注解的綜合應(yīng)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前言

前幾天學(xué)習(xí)了反射和自定義注解,剛好工作中遇到一個(gè)小問(wèn)題:前臺(tái)傳遞到后臺(tái)的必填字段為空,導(dǎo)致不能插入數(shù)據(jù)庫(kù)。就是這樣一個(gè)小問(wèn)題,讓我考慮到是否可以做一個(gè)通用的方法,讓前臺(tái)傳遞過(guò)來(lái)的必填字段在后臺(tái)也校驗(yàn)一遍,如果傳遞為空,則把響應(yīng)字段返回提示。因此,我考慮的是用注解的方式,在必填字段上面定義,利用反射得到必填字段的字段名,判斷是否為空,并返回響應(yīng)的信息。

需求模擬

假設(shè)客戶有:姓名,年齡,地址,手機(jī)號(hào)碼,身份證號(hào)等信息,而我們是做金融業(yè)務(wù),所以關(guān)鍵是看客戶的三要素:姓名,身份證號(hào),手機(jī)號(hào)碼。我們要保證前臺(tái)傳遞過(guò)來(lái)的這三個(gè)值不為空。
廢話不多說(shuō),直接上代碼。只看紅框里面的即可。

目錄結(jié)構(gòu)

客戶信息類:Customer

這個(gè)是個(gè)實(shí)體類,我們?cè)冢盒彰?,身份證號(hào)碼,手機(jī)號(hào)碼上都用了我們的自定義注解。
 

package com.dao.chu.po; 
 
/** 
 * 
* <p>Title: Customer</p> 
* <p>Description:客戶信息實(shí)體 </p> 
 */ 
public class Customer { 
 
  private int id; 
  @IsRequired 
  private String name; // 姓名 
  @IsRequired 
  private String idnum; // 身份證號(hào)碼 
  @IsRequired 
  private String phone; // 手機(jī)號(hào) 
  private String sex; // 性別 
  private int age; // 年齡 
  private String address; // 地址 
 
  @Override 
  public String toString() { 
    return "Customer [id=" + id + ", name=" + name + ", idnum=" + idnum 
        + ", phone=" + phone + ", sex=" + sex + ", age=" + age 
        + ", address=" + address + "]"; 
  } 
 
  public int getId() { 
    return id; 
  } 
 
  public void setId(int id) { 
    this.id = id; 
  } 
 
  public String getName() { 
    return name; 
  } 
 
  public void setName(String name) { 
    this.name = name; 
  } 
 
  public String getIdnum() { 
    return idnum; 
  } 
 
  public void setIdnum(String idnum) { 
    this.idnum = idnum; 
  } 
 
  public String getPhone() { 
    return phone; 
  } 
 
  public void setPhone(String phone) { 
    this.phone = phone; 
  } 
 
  public String getSex() { 
    return sex; 
  } 
 
  public void setSex(String sex) { 
    this.sex = sex; 
  } 
 
  public int getAge() { 
    return age; 
  } 
 
  public void setAge(int age) { 
    this.age = age; 
  } 
 
  public String getAddress() { 
    return address; 
  } 
 
  public void setAddress(String address) { 
    this.address = address; 
  } 
   
} 

自定義注解類:IsRequired
 

package com.dao.chu.po;  
import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 
 
/** 
 * 
* <p>Title: IsRequired</p> 
* <p>Description: 字段是否必填 </p> 
 */ 
@Retention(value = RetentionPolicy.RUNTIME)  
@Target(value = {ElementType.FIELD})  
public @interface IsRequired  
{  
  /** 
   *  
   
  * <p>Title: isRequired</p> 
  * <p>Description:true:必填 false:非必填 </p> 
  * @return 
   */ 
  boolean isRequired() default true;  
}  

關(guān)鍵工具類:PoUtils

我們?cè)谶@個(gè)類里面主要用了反射的知識(shí),得到帶有自定義注解的字段,并取得這個(gè)對(duì)象的值進(jìn)行判斷

package com.dao.chu.po;  
  
import java.beans.IntrospectionException; 
import java.beans.PropertyDescriptor; 
import java.lang.reflect.Field; 
import java.lang.reflect.InvocationTargetException; 
 
import javax.jws.WebResult; 
 
import com.sun.xml.internal.ws.util.StringUtils; 
  
/** 
 * 
* <p>Title: PoUtils</p> 
* <p>Description:Po操作工具類 </p> 
 */ 
@SuppressWarnings("unused")  
public class PoUtils  
{  
    
  /** 
  * <p>Title: getProperties</p> 
  * <p>Description: 獲取javabean屬性通用方法 </p> 
  * @param t 
  * @param beanName 
  * @return 
  * @throws IllegalAccessException 
  * @throws IllegalArgumentException 
  * @throws InvocationTargetException 
  * @throws IntrospectionException 
   */ 
  private static <T> Object getProperties(T t, String beanName)  
    throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException  
  {  
    Object nameValue = new PropertyDescriptor(beanName, t.getClass()).getReadMethod().invoke(t);  
    return nameValue;  
  }  
    
  /** 
  * <p>Title: IsFieldBlank</p> 
  * <p>Description:判斷前臺(tái)傳過(guò)來(lái)的必填字段是否為空 ,不正確則將相應(yīng)字段返回 </p> 
  * @param t 
  * @return 
  * @throws IllegalAccessException 
  * @throws IllegalArgumentException 
  * @throws InvocationTargetException 
  * @throws IntrospectionException 
   */ 
  public static <T> RespBody IsFieldBlank(T t)  
    throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, IntrospectionException  
  {  
    RespBody respBody = new RespBody(); 
    StringBuffer sb = new StringBuffer();  
      
    Field[] declaredFields = t.getClass().getDeclaredFields();  
    for (Field field : declaredFields)  
    {  
      field.setAccessible(true);  
      String name = field.getName();  
      boolean fieldHasAnno = field.isAnnotationPresent(IsRequired.class);  
      if (fieldHasAnno)  
      {  
        IsRequired annotation = field.getAnnotation(IsRequired.class);  
        boolean required = annotation.isRequired();  
        if (required)  
        {  
          Object value = getProperties(t, name);  
          if (null == value)  
          {  
            sb.append(name + ",");  
          }  
        }  
      }  
    }  
      
    if (null==sb.toString()||"".equals(sb.toString()))  
    {  
      respBody.isSuccess(); 
    }  
      
    respBody.setSuccess(false); 
    respBody.setMsg(sb.toString().substring(0,sb.toString().lastIndexOf(",")) + " is required");  
    return respBody;  
  }  
}  

RespBody:響應(yīng)實(shí)體類

封裝了響應(yīng)的成功失敗以及一些信息

 package com.dao.chu.po; 
 
/** 
 * 
* <p>Title: RespBody</p> 
* <p>Description: 響應(yīng)實(shí)體類</p> 
 */ 
public class RespBody  
{  
  private boolean isSuccess = true;  
    
  private String msg;  
    
  private Object data;  
    
  public boolean isSuccess()  
  {  
    return isSuccess;  
  }  
    
  public void setSuccess(boolean isSuccess)  
  {  
    this.isSuccess = isSuccess;  
  }  
    
  public String getMsg()  
  {  
    return msg;  
  }  
    
  public void setMsg(String msg)  
  {  
    this.msg = msg;  
  }  
    
  public Object getData()  
  {  
    return data;  
  }  
    
  public void setData(Object data)  
  {  
    this.data = data;  
  }  
    
  public RespBody(boolean isSuccess, String msg, Object data)  
  {  
    super();  
    this.isSuccess = isSuccess;  
    this.msg = msg;  
    this.data = data;  
  }  
    
  public RespBody(boolean isSuccess, String msg)  
  {  
    super();  
    this.isSuccess = isSuccess;  
    this.msg = msg;  
  }  
    
  public RespBody()  
  {  
  }  
    
  @Override  
  public String toString()  
  {  
    return "ReturnBody [isSuccess=" + isSuccess + ", msg=" + msg + ", data=" + data + "]";  
  }  
}  

測(cè)試類:IsRequiredTest

 package com.dao.chu.po; 
 
/** 
 * 
* <p>Title: IsRequiredTest</p> 
* <p>Description: 必填成員變量測(cè)試類</p> 
 */ 
public class IsRequiredTest { 
 
  public static void main(String[] args) { 
     
    Customer customer = new Customer(); 
     
    try { 
      //=========第一次不賦值========== 
      RespBody respBody = PoUtils.IsFieldBlank(customer); 
      //不通過(guò)則返回提示信息 
      if (!respBody.isSuccess()) { 
        System.out.println("1."+respBody.getMsg()); 
      } 
       
      //=========第二次給姓名賦值========== 
      customer.setName("張三"); 
      respBody = PoUtils.IsFieldBlank(customer); 
      //不通過(guò)則返回提示信息 
      if (!respBody.isSuccess()) { 
        System.out.println("2."+respBody.getMsg()); 
      } 
       
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
   
   
   
} 

輸出結(jié)果

第一次三個(gè)值都為空,提示三個(gè)都是必填的,第二次因?yàn)樾彰x值了,所以提示另外兩個(gè)是必填的,本次實(shí)驗(yàn)宣告結(jié)束,本人知識(shí)有限,若有更好的方法歡迎指正

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中增強(qiáng)for循環(huán)代碼示例

    Java中增強(qiáng)for循環(huán)代碼示例

    這篇文章主要給大家介紹了Java中增強(qiáng)for循環(huán)的相關(guān)資料,for/in循環(huán)就是JDK5.0中所謂的增強(qiáng)For循環(huán),它能對(duì)數(shù)組和集合進(jìn)行遍歷,使用它會(huì)使用你的代碼短小而精煉的多,需要的朋友可以參考下
    2023-10-10
  • Java實(shí)現(xiàn)三子棋游戲

    Java實(shí)現(xiàn)三子棋游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)三子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Maven依賴管理之parent與dependencyManagement深入分析

    Maven依賴管理之parent與dependencyManagement深入分析

    首先我們來(lái)說(shuō)說(shuō)parent標(biāo)簽,其實(shí)這個(gè)不難解釋,就是父的意思,pom也有繼承的。比方說(shuō)我現(xiàn)在有A,B,C,A是B,C的父級(jí)。現(xiàn)在就是有一個(gè)情況B,C其實(shí)有很多jar都是共同的,其實(shí)是可以放在父項(xiàng)目里面,這樣,讓B,C都繼承A就方便管理了
    2022-10-10
  • Mybatis中的mapper模糊查詢語(yǔ)句LIKE

    Mybatis中的mapper模糊查詢語(yǔ)句LIKE

    這篇文章主要介紹了Mybatis中的mapper模糊查詢語(yǔ)句LIKE,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2021-12-12
  • Java?CompletableFuture實(shí)現(xiàn)原理分析詳解

    Java?CompletableFuture實(shí)現(xiàn)原理分析詳解

    CompletableFuture是Java8并發(fā)新特性,本文我們主要來(lái)聊一聊CompletableFuture的回調(diào)功能以及異步工作原理是如何實(shí)現(xiàn)的,需要的可以了解一下
    2022-09-09
  • Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解

    Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解

    這篇文章主要介紹了Java中三種零拷貝的實(shí)現(xiàn)示例以及對(duì)比詳解,本文主要是介紹幾種零拷貝的實(shí)現(xiàn)示例,以及與最傳統(tǒng)的做一個(gè)對(duì)比,看看在效率上到底有多大的提升,需要的朋友可以參考下
    2023-12-12
  • WMTS中TileMatrix與ScaleDenominator淺析

    WMTS中TileMatrix與ScaleDenominator淺析

    這篇文章主要為大家介紹了WMTS中TileMatrix與ScaleDenominator淺析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 淺析Java中的異常處理機(jī)制

    淺析Java中的異常處理機(jī)制

    這篇文章主要介紹了Java中的異常處理機(jī)制的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-11-11
  • SpringBoot中的@CacheEvict 注解的實(shí)現(xiàn)

    SpringBoot中的@CacheEvict 注解的實(shí)現(xiàn)

    本文主要介紹了SpringBoot中的@CacheEvict注解的實(shí)現(xiàn),@CacheEvict 注解用于清空緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • MybatisPlus使用Mybatis的XML的動(dòng)態(tài)SQL的功能實(shí)現(xiàn)多表查詢

    MybatisPlus使用Mybatis的XML的動(dòng)態(tài)SQL的功能實(shí)現(xiàn)多表查詢

    本文主要介紹了MybatisPlus使用Mybatis的XML的動(dòng)態(tài)SQL的功能實(shí)現(xiàn)多表查詢,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-11-11

最新評(píng)論