/**
* 自定义注解:校验非空字段
*
*/
@Documented
@Inherited
// 接口、类、枚举、注解
@Target(ElementType.FIELD)
//只是在运行时通过反射机制来获取注解,然后自己写相应逻辑(所谓注解解析器)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckNull {
String message() default "默认值为0";
}

  

/**
* 用户实体类
*
*/
public class UserRegister implements Serializable { private static final long serialVersionUID = 1L; //自定义注解
@CheckNull(message="用户名不能为空")
private String userAccount;
//自定义注解
@CheckNull(message="密码不能为空")
private String passWord; private UserRegister(Builder builder){
this.userAccount = builder.userAccount;
this.passWord = builder.passWord;
}
public static class Builder{
private String userAccount;
private String passWord; public Builder userAccount(String userAccount){
this.userAccount = userAccount;
return this;
} public Builder passWord(String passWord){
this.passWord = passWord;
return this;
} public UserRegister build(){
return new UserRegister(this);
}
}
@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();
}
}

  

/**
* 自定义异常类
*
*/
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);
} }

  

/**
* 公共工具类
*
*/
public class CommonUtils{ /**
* 通过反射来获取javaBean上的注解信息,判断属性值信息,然后通过注解元数据来返回
*/
public static <T> boolean doValidator(T clas){
Class<?> clazz = clas.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
CheckNull checkNull = field.getAnnotation(CheckNull.class);
if (null!=checkNull) {
Object value = getValue(clas, field.getName());
if (!notNull(value)) {
throwExcpetion(checkNull.message());
}
}
}
return true;
} /**
* 获取当前fieldName对应的值
*
* @param clas 对应的bean对象
* @param fieldName bean中对应的属性名称
* @return
*/
public static <T> 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(isEmpty(msg)){
throw new CustBusinessException(msg);
}
} }

  

public class TestUtils{

    public static void main(String[] args) {
UserRegister userRegister = new UserRegister.Builder().userAccount("小小高").passWord("123456").build();
System.out.println(insertUser(userRegister));
System.out.println(userRegister.toString());
} public static Result insertUser(UserRegister param){
// Result result = new Result(1, "新增失败");
Result result;
try {
CommonUtils.doValidator(param);
result = Result.build(0, "新增成功");
} catch (Exception e) {
result = Result.build(1, e.getMessage());
}
return result;
} }

  

/**
* 结果集返回包装类
*/
public class Result extends HashMap<String, Object> 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);
} }

  

java自定义注解代码练习的更多相关文章

  1. java自定义注解类

    一.前言 今天阅读帆哥代码的时候,看到了之前没有见过的新东西, 比如java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思? 于是乎,学习并整理了一下. 二.代码示例 import ...

  2. java自定义注解实现前后台参数校验

    2016.07.26 qq:992591601,欢迎交流 首先介绍些基本概念: Annotations(also known as metadata)provide a formalized way ...

  3. java自定义注解注解方法、类、属性等等【转】

    http://anole1982.iteye.com/blog/1450421 http://www.open-open.com/doc/view/51fe76de67214563b20b385320 ...

  4. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  5. JAVA自定义注解 ------ Annotation

    日常开发工作中,合理的使用注解,可以简化代码编写以及使代码结构更加简单,下面记录下,JAVA自定义注解的开发过程. 定义注解声明类. 编写注解处理器(主要起作用部分). 使用注解. 相关知识点介绍, ...

  6. Java自定义注解和运行时靠反射获取注解

    转载:http://blog.csdn.net/bao19901210/article/details/17201173/ java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编 ...

  7. Java自定义注解的实现

    Java自定义注解的实现,总共三步(eg.@RandomlyThrowsException): 1.首先编写一个自定义注解@RandomlyThrowsException package com.gi ...

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

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性) 前言:由于前段时间忙于写接口,在接口中需要做很多的参数校验,本着简洁.高效的原则,便写了这个小工具供自己使用(内容 ...

  9. 【转】 java自定义注解

    java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能. 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annot ...

随机推荐

  1. js实现canvas保存图片为png格式并下载到本地

    canvas 保存图片 下载到本地 function base64Img2Blob(code){ var parts = code.split(';base64,'); var contentType ...

  2. bzoj1008题解

    [题意分析] 求长度为n,元素大小在[1,m]∩N的序列中,有多少个序列中存在相同的相邻元素. [解题思路] 小学奥数题.. 总序列数:S=mn 不存在相同的相邻元素的序列数:T=m*(m-1)n-1 ...

  3. ggplot2在一幅图上画两条曲线

    ggplot2在一幅图上画两条曲线 print(data)后的结果是 C BROWN.P MI.P 0 0.9216 0.9282 30 0.9240 0.9282 100 0.9255 0.9282 ...

  4. mysql 第一次启动及常用命令

    启动 mysql -u root -p 进入后 # 显示有几个数据库 mysql> show databases; +--------------------+ | Database | +-- ...

  5. 阿里云ecs(phpstudy一件包)

            选择语言       保存并连接    Linux硬盘挂载是比较常见的管理操作之一.默认情况下数据盘没有挂载,需要手动挂载到系统中.     具体操作是分三步:     硬盘挂载1)需 ...

  6. Portainer Exec Container 失败解决方案

    近日,将portainer服务挂了个域名,然后用Nginx代理的时候发现不能attach容器了,经过搜索在issue 找到解决方案 1.修改Nginx config server { listen 8 ...

  7. /lib/libmysqlcppconn.so: undefined reference to `mysql_stmt_execute@libmysqlclient_18' 解决方法

    sudo apt-get install libmysqlcppconn-dev

  8. parallels desktop虚拟机与Mac共享网络设置方法

    查看vnic0的ip centos7设置ip parallels desktop偏好设置 最后可以互ping 也可以ping外网

  9. 4-MySQL高级-事务-提交(3)

    提交 为了演示效果,需要打开两个终端窗口,使用同一个数据库,操作同一张表 step1:连接 终端1:查询商品分类信息 select * from goods_cates; step2:增加数据 终端2 ...

  10. 【LGP5127】子异和

    题目 子异和这个名字,真是思博 显然一个集合的子集异或和为,\(2^{|S|-1}\times A\),\(A\)为集合的或和 于是现在的问题变成了树链异或一个数,求树链或和 显然强行拆位是可以做的, ...