Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java

前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁、高效的原则,便写了这个小工具供本身使用(内容为缩减版,具体业务可自行扩展)app

思路:使用Java反射机制,读取实体类属性头部注解,经过get方法获取参数值进行校验,若是为空则进行异常抛出。ide

CheckNull.java 类工具

package com.seesun2012.common.annotation;

import java.lang.annotation.Documented;

import java.lang.annotation.ElementType;

import java.lang.annotation.Inherited;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

* 自定义注解:校验非空字段

*

* @author seesun2012@163.com

*

*/

@Documented

@Inherited

// 接口、类、枚举、注解

@Target(ElementType.FIELD)

//只是在运行时经过反射机制来获取注解,而后本身写相应逻辑(所谓注解解析器)

@Retention(RetentionPolicy.RUNTIME)

public @interface CheckNull {

String message();

}

Userregister.java 类ui

package com.seesun2012.common.entity;

import java.io.Serializable;

import com.seesun2012.common.annotation.CheckNull;

/**

* 用户注册实体类

*

* @author seesun2012@163.com

*

*/

public class Userregister implements Serializable{

private static final long serialVersionUID = 1L;

//自定义注解

@CheckNull(message="用户名不能为空")

private String userAccount;

//自定义注解

@CheckNull(message="密码不能为空")

private String passWord;

public String getUserAccount() { return userAccount; }

public void setUserAccount(String userAccount) { this.userAccount = userAccount; }

public String getPassWord() { return passWord; }

public void setPassWord(String passWord) { this.passWord = passWord; }

@Override

public String toString() {

StringBuilder sb = new StringBuilder();

sb.append(getClass().getSimpleName());

sb.append(" [");

sb.append("Hash = ").append(hashCode());

sb.append(", userAccount=").append(userAccount);

sb.append(", passWord=").append(passWord);

sb.append(", serialVersionUID=").append(serialVersionUID);

sb.append("]");

return sb.toString();

}

}

CommonUtils.java 类this

package com.seesun2012.common.utils;

import java.beans.BeanInfo;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.List;

import com.seesun2012.common.annotation.CheckNull;

import com.seesun2012.common.exception.CustBusinessException;

/**

* 公共工具类

*

* @author seesun2012@163.com

*

*/

public class CommonUtils{

/**

* 经过反射来获取javaBean上的注解信息,判断属性值信息,而后经过注解元数据来返回

*/

public static boolean doValidator(T clas){

Class> clazz = clas.getClass();

Field[] fields = clazz.getDeclaredFields();

for (Field field : fields) {

CheckNull checkNull = field.getDeclaredAnnotation(CheckNull.class);

if (null!=checkNull) {

Object value = getValue(clas, field.getName());

if (!notNull(value)) {

throwExcpetion(checkNull.message());

}

}

}

return true;

}

/**

* 获取当前fieldName对应的值

*

* @param clas对应的bean对象

* @param fieldNamebean中对应的属性名称

* @return

*/

public static Object getValue(T clas,String fieldName){

Object value = null;

try {

BeanInfo beanInfo = Introspector.getBeanInfo(clas.getClass());

PropertyDescriptor[] props = beanInfo.getPropertyDescriptors();

for (PropertyDescriptor property : props) {

if (fieldName.equals(property.getName())) {

Method method = property.getReadMethod();

value = method.invoke(clas, new Object[]{});

}

}

} catch (Exception e) {

e.printStackTrace();

}

return value;

}

/**

* 非空校验

*

* @param value

* @return

*/

public static boolean notNull(Object value){

if(null==value){

return false;

}

if(value instanceof String && isEmpty((String)value)){

return false;

}

if(value instanceof List && isEmpty((List>)value)){

return false;

}

return null!=value;

}

public static boolean isEmpty(String str){

return null==str || str.isEmpty();

}

public static boolean isEmpty(List> list){

return null==list || list.isEmpty();

}

private static void throwExcpetion(String msg) {

if(null!=msg){

throw new CustBusinessException(msg);

}

}

}

Result.java 类code

package com.seesun2012.common.entity;

import java.io.Serializable;

import java.util.HashMap;

public class Result extends HashMap implements Serializable {

private static final long serialVersionUID = 1L;

public static final Result SUCCEED = new Result(0, "操做成功");

public Result(int status, String massage) {

super();

this.put("status", status).put("message", massage);

}

public Result put(String key, Object value) {

super.put(key, value);

return this;

}

public static Result build(int i, String message) {

return new Result(i, message);

}

}

CustBusinessException.java 类对象

package com.seesun2012.common.exception;

/**

* 自定义异常类

*

* @author seesun2012@163.com

*

*/

public class CustBusinessException extends RuntimeException{

private static final long serialVersionUID = 1L;

public CustBusinessException(){

}

public CustBusinessException(String str){

super(str);

}

public CustBusinessException(Throwable throwable){

super(throwable);

}

public CustBusinessException(String str, Throwable throwable){

super(str, throwable);

}

}

TestUtils.java 类接口

package com.seesun2012.test.utils;

import com.seesun2012.common.entity.Result;

import com.seesun2012.common.entity.Userregister;

import com.seesun2012.common.utils.CommonUtils;

public class TestUtils{

public static void main(String[] args) {

Userregister sss = new Userregister();

sss.setUserAccount("asdflkjasokdfj");

System.out.println(insertUser(sss));

}

public static Result insertUser(Userregister param){

Result result = new Result(1, "新增失败");

try {

CommonUtils.doValidator(param);

result = Result.build(0, "新增成功");

} catch (Exception e) {

result = Result.build(1, e.getMessage());

}

return result;

}

}

结语:该用户暂未添加ip

java中注解动态传参_Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)...相关推荐

  1. java中位运算传参_java基础之位运算讲解于实战

    一.基础知识点概括 在查看源码中,经常会看到很多这样的符号"&"."|"."-","^","<& ...

  2. java 调用kettle job 传参_java调用kettle向job(任务)和transformation(转换)传递参数实例...

    虽然网上文章有说java可以传递参数给kettle,不过只找到了传递参数给转换的文章,没有讲参数传递给job,kettle中如何使用java传递的参数.今天就以上问题,一并共享. /** * 本测试类 ...

  3. java中注解动态传参_SpringMVC之注解、传参、返回值及拦截器

    1. 注解式开发之annotation-driven解释 (1) mvc注解驱动在哪个文件中配置? Springmvc.xml (2) 配置mvc注解驱动使用哪个标签? 2. 注解式开发之视图解析器 ...

  4. java中Long类型传参校验注解_JAVA——实现json bean实体类的传参校验模板及注解详解...

    关注wx:CodingTechWork,一起学习进步. 引言 在java开发中,经常需要和外界系统进行参数对接,api设计中难免会遇到json传参不一致的情况,虽然纸面或者接口规范约束了应该怎么传参, ...

  5. vue 中的动态传参和query传参

    Vue router 如何传参 params.query 是什么? params:/router1/:id,这里的 id 叫做 params.例如/router1/123, /router1/789 ...

  6. Java中字符串拼接的几种方式(源码分析)

    字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起. 我们都知道,String是Java中一个不可变的类,所以他一旦被实例化就无法被修改. 不可变类的实例一旦创建,其成员变 ...

  7. python传参是什么意思_如何最简单、通俗地理解Python的传入参数?

    目录: 一.笔记 二.我的自学路线 三.笔记目录 一.笔记 ① 传入参数分为形参和实参两种,形参是形式参数(变量),实参是实际参数(值). ② 传入参数,一个星号 * 表示传入一个元组,两个星号表示传 ...

  8. java sql进销存_[内附完整源码和文档] 基于Java和Sql Server 2008的陶瓷工厂进销存管理系统...

    摘 要 时代在进步,我们的生产生活方式当然也要相对应的做出改变了.在今天这样一个信息化的时代,计算机软件已经广泛的被用于日常的办公,仓库的库存管理,企业的人员以及资产管理,文字的编辑处理,电子表格的广 ...

  9. java中设置表格的宽度_java 画pdf用itext调整表格宽度、自定义各个列宽的方法

    ps:我用的版本是7.0.5 场景: 左侧第一列宽度不够,导致数据换行. Table table = new Table(new float[2]); new 一个Table之后,setWidthPe ...

最新文章

  1. rman命令学习-tina(下)
  2. play store显示“从服务器检索信息时出错。DF-DFERH-01”问题解决
  3. 【转载+软件实际操作 OpenHW12参赛手记】ZedBoard-裸机下运行Hello,World【常见错误解决方案】++...
  4. Webex远程网络视频会议使用指南
  5. Android UI编程之自定义控件——可高亮显示的TextView
  6. 微信小程序获取当前时间戳、获取当前时间、时间戳加减
  7. 报表在IBM AIX系统下resin部署
  8. PhpStorm 的基本应用
  9. 朗读评价语言集锦_表扬朗读好的评语简短
  10. 阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制
  11. 完全java实现一款开源的报表工具简表(JOR)
  12. RabbitMQ延迟队列
  13. 程序哨兵----誓把流氓软件赶出我们的电脑!
  14. 工业控制计算机固态硬盘,我们如何选择一款好的工业级固态硬盘?
  15. Python网络编程之初识
  16. 统信UOS系统添加Windows系统共享的打印机
  17. unity抠人像原理_PS 抠人像如何抠得干净?
  18. 数据赋能:Uber的数据治理实践分享
  19. SharePoint 2010 类似人人网站内信功能实施
  20. 没有美术基础学游戏建模走的通吗?

热门文章

  1. 网众无盘多服务器,网众无盘多配置建立方案
  2. UE4 动画重定向之使用同一套骨骼
  3. 甘肃省金昌市谷歌卫星地图下载(百度网盘离线包下载)
  4. 【Excel】将内容粘贴到合并的单元格中
  5. 基于野狗优化算法的函数寻优算法
  6. 天猫精灵 python_天猫精灵连接蓝牙摸索1 关于阿里巴巴蓝牙MESH芯片TG7100B LINUX 开发环境塔建图文说明...
  7. SSM中的拦截器机制
  8. 台式计算机电源键坏了,电脑电源开关键损坏怎么解决 电脑电源灯不亮了怎么办...
  9. 5G和Wi-Fi 6相爱相杀,谁才是未来的无线网主角?
  10. 虚拟局域网VLAN实验操作