Java反射机制如何解决数据传值为空的问题

 更新时间:2022年03月02日 09:41:26   作者:大哥虚过谁  
这篇文章主要介绍了Java反射机制如何解决数据传值为空的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

反射机制数据传值为空的问题

两个小方法,用于解决BeanUtils.copyProperties(x, y);中源对象的值为空问题

1.通过实体注解数据库字段为Map的Key,需要的非空值为Value封装数据

@Override
    public Map<String, Object> setNodeParamItems(DispatchInfoItem dispatchInfoItem) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Map<String, Object> map = new HashMap<>();
        DispatchInfo dispatchInfo = new DispatchInfo();
        if (null != dispatchInfoItem) {
            BeanUtils.copyProperties(dispatchInfoItem, dispatchInfo);
        }
        Method[] methods = dispatchInfo.getClass().getDeclaredMethods();
        if (methods != null) {
            for (Method method : methods) {
                String methodName = method.getName();
                if (methodName.startsWith("get")) {
                    Column column = dispatchInfo.getClass().getDeclaredMethod(methodName).getAnnotation(Column.class);
                    Object value = method.invoke(dispatchInfo);
                    if (null != column && StringUtils.isNotBlank(StringHelper.getString(value))) {
                        map.put(column.name(), value);
                    }
                }
            }
        }
        return map;
    }

2.根据获取的值注入;

public void getMethods(DispatchInfo dispatchInfo, Map<String, Object> map) throws Exception {
        //获取方法上的注解值
        Method[] methods = dispatchInfo.getClass().getDeclaredMethods();
        if (methods != null) {
            for (Method method : methods) {
                String methodName = method.getName();
                if (methodName.startsWith("get")) {
                    Column column = dispatchInfo.getClass().getDeclaredMethod(methodName).getAnnotation(Column.class);
                    if (column != null) {
                        String setMethodName = methodName.replaceFirst("(get)", "set");
                        Method setMethod = dispatchInfo.getClass().getMethod(setMethodName, method.getReturnType());
                        ;
                        if (null != map.get(column.name())) {
                            setMethod.invoke(dispatchInfo, map.get(column.name()));
                        }
                    }
                }
            }
        }
    }

3.根据值进行实际的操作 

java 反射 处理 空值

package org.zkdg.utils.spring.annotations.impl;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.sql.SQLException;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import org.zkdg.utils.entity.AjaxEntity;
import org.zkdg.utils.spring.annotations.NNull;
@Aspect
@Component
/**
 * 
 * @author 王海明
 * @createData 2017年7月13日 上午8:36:23
 * @说明 :出了一些空值。。。
 */
public class AjaxEntityHandler {
    // @Pointcut("@annotation(org.zkdg.utils.annotations.AfterHandler)")
    @Pointcut("@annotation(org.zkdg.utils.spring.annotations.NullValidate)")
    // @Pointcut("execution(* org.dcexam.*.service.*.*(..))")
    public void beforeCall() {
        // service方法调用之前,检测参数,仅限第一个参数, 不能为空值
    }
    /**
     * service发生异常时调用
     */
    @Pointcut("execution(* org.dcexam.*.service.*.*(..))")
    public void afterThrowEx() {
        System.out.println("************\n\n\n\n\n\n\n\n\n\n\n\n*******");
    }
    @Around(value = "beforeCall()")
    public AjaxEntity doBefore(ProceedingJoinPoint point) throws Throwable {
        // TODO Auto-generated method stub
        // 判断不能为空
        Object[] args = point.getArgs();
        if (args == null || args[0] == null) {
            return new AjaxEntity("warning", "未选择任何数据。。。");
        }
        // 获取代理对象类方法参数
        MethodSignature target = (MethodSignature) point.getSignature();
        Annotation[][] annotations = target.getMethod().getParameterAnnotations();
        int argsIndex = 0;
        StringBuilder sb = new StringBuilder();
        for (Annotation[] annotation : annotations) {
            NNull nn = (NNull) annotation[0];
            String[] descs = nn.desc();
            String[] fields = nn.field();
            if (fields.length > 0 && fields.length > 0 && descs.length == fields.length) {
                for (int i = 0; i < fields.length; i++) {
                    Field field = args[argsIndex].getClass().getDeclaredField(fields[i]);
                    // 允许访问
                    field.setAccessible(true);
                    Object object = field.get(args[argsIndex]);
                    if (object == null) {
                        sb.append(descs[i]).append("不能为空。。。<br>");
                    }
                    if (object instanceof String) {
                        String string = (String) object;
                        if (string.trim().length() == 0)
                            sb.append(descs[i]).append("不能为空。。。<br>");
                        else if (string.trim().equals("0"))
                            sb.append("未选择" + descs[i] + "。。。<br>");
                    } else if (object instanceof Number) {
                        Integer integer = (Integer) object;
                        if (integer == 0)
                            sb.append("未选择" + descs[i] + "。。。<br>");
                    }
                }
                if (sb.length() > 0)
                    return AjaxEntity.ERROR(sb.toString());
            }
            argsIndex++;
        }
        // 加上@Nullvalidate 注解,不允许出现空 值
        for (Object obj : args) {
            if (obj == null) {
                return AjaxEntity.WARNING("出现了不允许的空值");
            } else if (obj instanceof String) {
                if (((String) obj).length() == 0) {
                    return AjaxEntity.WARNING("出现了不允许的空值");
                }
            }
        }
        AjaxEntity ajax = (AjaxEntity) point.proceed(args);
        return ajax == null ? AjaxEntity.ERROR("操作失败") : ajax;
    }
    /**
     * 
     * @param joinPoint
     *            连接点
     * @param ex
     *            异常
     * @return AjaxEntity 异常信息
     */
    @AfterThrowing(value = "afterThrowEx()", throwing = "ex")
    public void doAfterThrowEx(JoinPoint joinPoint, Exception ex) {
        AjaxEntity ajax = new AjaxEntity();
        if (ex.getCause() instanceof SQLException) {
            // 数据库操作异常
            ajax = AjaxEntity.ERROR("操作数据库时出现异常");
        }
    }
}

另外,java 命名时 。属性最好不要有下划线,否则可能会粗错。。。。。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mybatis插入Oracle数据库日期型数据过程解析

    Mybatis插入Oracle数据库日期型数据过程解析

    这篇文章主要介绍了Mybatis插入Oracle数据库日期型数据过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java接口操作(继承父类并实现多个接口)

    Java接口操作(继承父类并实现多个接口)

    这篇文章主要介绍了Java接口操作(继承父类并实现多个接口),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • java截取字符串中的指定字符的两种方法(以base64图片为例)

    java截取字符串中的指定字符的两种方法(以base64图片为例)

    本文介绍了使用Java截取字符串中指定字符的方法,通过substring索引和正则实现,文章详细介绍了实现步骤和示例代码,对于想要了解如何使用Java截取字符串指定字符的读者具有一定的参考价值
    2023-08-08
  • mybatis自定义类型处理器TypehHandler示例详解

    mybatis自定义类型处理器TypehHandler示例详解

    我们在写mapper映射器的配置文件时,不经意间已经用到类型转换,不过是mybatis帮我们完成的,下面这篇文章主要给大家介绍了关于mybatis自定义类型处理器TypehHandler的相关资料,需要的朋友可以参考下
    2018-09-09
  • 基于sharding-jdbc的使用限制

    基于sharding-jdbc的使用限制

    这篇文章主要介绍了sharding-jdbc的使用限制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java处理数据库不支持的emoji表情符问题解决

    java处理数据库不支持的emoji表情符问题解决

    这篇文章主要介绍了java处理数据库不支持的emoji表情符问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • java大话之创建型设计模式教程示例

    java大话之创建型设计模式教程示例

    这篇文章主要为大家介绍了java大话之创建型设计模式教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Springboot+mybatis-plus+注解实现数据权限隔离

    Springboot+mybatis-plus+注解实现数据权限隔离

    本文将结合实例代码,介绍Springboot+mybatis-plus+注解实现数据权限隔离,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • javaweb中Http协议详解

    javaweb中Http协议详解

    HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。这篇文章主要为大家详细介绍了javaweb中的Http协议,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Spring MVC获取查询参数及路径参数代码实例

    Spring MVC获取查询参数及路径参数代码实例

    这篇文章主要介绍了Spring MVC获取查询参数及路径参数代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论