浅谈java反射和自定义注解的综合应用实例

发布时间 - 2026-01-11 03:03:44    点击率:

前言

前几天学习了反射和自定义注解,刚好工作中遇到一个小问题:前台传递到后台的必填字段为空,导致不能插入数据库。就是这样一个小问题,让我考虑到是否可以做一个通用的方法,让前台传递过来的必填字段在后台也校验一遍,如果传递为空,则把响应字段返回提示。因此,我考虑的是用注解的方式,在必填字段上面定义,利用反射得到必填字段的字段名,判断是否为空,并返回响应的信息。

需求模拟

假设客户有:姓名,年龄,地址,手机号码,身份证号等信息,而我们是做金融业务,所以关键是看客户的三要素:姓名,身份证号,手机号码。我们要保证前台传递过来的这三个值不为空。
废话不多说,直接上代码。只看红框里面的即可。

目录结构

客户信息类:Customer

这个是个实体类,我们在:姓名,身份证号码,手机号码上都用了我们的自定义注解。
 

package com.dao.chu.po; 
 
/** 
 * 
* <p>Title: Customer</p> 
* <p>Description:客户信息实体 </p> 
 */ 
public class Customer { 
 
  private int id; 
  @IsRequired 
  private String name; // 姓名 
  @IsRequired 
  private String idnum; // 身份证号码 
  @IsRequired 
  private String phone; // 手机号 
  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;  
}  

关键工具类:PoUtils

我们在这个类里面主要用了反射的知识,得到带有自定义注解的字段,并取得这个对象的值进行判断

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:判断前台传过来的必填字段是否为空 ,不正确则将相应字段返回 </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:响应实体类

封装了响应的成功失败以及一些信息

 package com.dao.chu.po; 
 
/** 
 * 
* <p>Title: RespBody</p> 
* <p>Description: 响应实体类</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 + "]";  
  }  
}  

测试类:IsRequiredTest

 package com.dao.chu.po; 
 
/** 
 * 
* <p>Title: IsRequiredTest</p> 
* <p>Description: 必填成员变量测试类</p> 
 */ 
public class IsRequiredTest { 
 
  public static void main(String[] args) { 
     
    Customer customer = new Customer(); 
     
    try { 
      //=========第一次不赋值========== 
      RespBody respBody = PoUtils.IsFieldBlank(customer); 
      //不通过则返回提示信息 
      if (!respBody.isSuccess()) { 
        System.out.println("1."+respBody.getMsg()); 
      } 
       
      //=========第二次给姓名赋值========== 
      customer.setName("张三"); 
      respBody = PoUtils.IsFieldBlank(customer); 
      //不通过则返回提示信息 
      if (!respBody.isSuccess()) { 
        System.out.println("2."+respBody.getMsg()); 
      } 
       
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
   
   
   
} 

输出结果

第一次三个值都为空,提示三个都是必填的,第二次因为姓名赋值了,所以提示另外两个是必填的,本次实验宣告结束,本人知识有限,若有更好的方法欢迎指正

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# java  # 自定义注解  # 反射  # java自定义注解实例  # Java反射机制基础详解  # 一篇文章带你搞定JAVA反射  # Java反射机制的简单讲解  # 详解Java反射创建对象  # 利用JAVA反射  # 读取数据库表名  # 自动生成对应实体类的操作  # 利用Java反射机制实现对象相同字段的复制操作  # java反射超详细讲解  # 必填  # 为空  # 自定义  # 提示信息  # 用了  # 身份证号码  # 实体类  # 的是  # 都是  # 不通过  # 是个  # 让我  # 在这个  # 一遍  # 这样一个  # 考虑到  # 做一个  # 若有  # 上都  # 前几天 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 公司网站制作需要多少钱,找人做公司网站需要多少钱?  Android滚轮选择时间控件使用详解  详解Android——蓝牙技术 带你实现终端间数据传输  如何在宝塔面板创建新站点?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  动图在线制作网站有哪些,滑动动图图集怎么做?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  java获取注册ip实例  JavaScript如何实现错误处理_try...catch如何捕获异常?  高防服务器如何保障网站安全无虞?  焦点电影公司作品,电影焦点结局是什么?  Android Socket接口实现即时通讯实例代码  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何实现建站之星域名转发设置?  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  如何用y主机助手快速搭建网站?  如何撰写建站申请书?关键要点有哪些?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  Laravel如何处理和验证JSON类型的数据库字段  实例解析angularjs的filter过滤器  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何快速生成橙子建站落地页链接?  如何在阿里云通过域名搭建网站?  如何在企业微信快速生成手机电脑官网?  如何在橙子建站中快速调整背景颜色?  怎么用AI帮你为初创公司进行市场定位分析?  Python文件流缓冲机制_IO性能解析【教程】  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  如何有效防御Web建站篡改攻击?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  利用python获取某年中每个月的第一天和最后一天  网站制作壁纸教程视频,电脑壁纸网站?  如何构建满足综合性能需求的优质建站方案?  Laravel如何配置和使用缓存?(Redis代码示例)  活动邀请函制作网站有哪些,活动邀请函文案?  如何基于云服务器快速搭建网站及云盘系统?  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  网站制作免费,什么网站能看正片电影?  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何快速配置高效服务器建站软件?  Laravel如何编写单元测试和功能测试?(PHPUnit示例)