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("************











*******");
    }

    @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 命名 时 。属性最好不要有 下划线 , 否则 可能会粗错。。。。。

原文地址:https://www.cnblogs.com/whm-blog/p/7170598.html