java中动态拼接条件的技巧_Java注解实现动态拼接参数

importjava.io.IOException;importjava.lang.reflect.Method;importjava.util.Arrays;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.concurrent.atomic.AtomicBoolean;importjava.util.concurrent.atomic.AtomicReference;importcom.alibaba.fastjson.JSONObject;importorg.apache.commons.lang.StringUtils;importorg.aspectj.lang.JoinPoint;importorg.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;importorg.aspectj.lang.reflect.MethodSignature;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;

@Aspect

@Componentpublic classLogAdvice {

@Autowiredprivate static final Logger logger=LoggerFactory.getLogger(LogAdvice.class);

@Pointcut("@annotation(注解路径)")public voidserviceAspect() {

}

@After("serviceAspect()")public void after(JoinPoint joinPoint) throwsIOException {

logger.info("开始记录日志*************************");

MethodSignature ms=(MethodSignature) joinPoint.getSignature();

Method method=ms.getMethod();

Log myAnnotation= method.getAnnotation(Log.class);

Map paramsMap = new HashMap<>();

String[] argNames= ((MethodSignature)joinPoint.getSignature()).getParameterNames(); //参数名

Object[] argObjects = joinPoint.getArgs(); //参数

List argNameList =Arrays.asList(argNames);

resolveArgs(joinPoint,argNameList,argObjects,paramsMap);

saveToDbLog(myAnnotation,paramsMap);

}

@AfterReturning(pointcut= "serviceAspect()",returning="returnValue")public voidafterreturningJoinPoint(JoinPoint joinPoint ,Object returnValue){//System.out.println("后置通知"+joinPoint+"返回值"+returnValue);

}

@Around("serviceAspect()")public Object around(ProceedingJoinPoint pjp) throwsThrowable{

Object object=pjp.proceed();returnobject;

}public static void saveToDbLog(Log myAnnotation, MapparamsMap){

String description=myAnnotation.description();

description=handleAnnotation(description,paramsMap);

System.out.println(description);

//TODO db操作

}public static String handleAnnotation(String description, MapparamsMap){

AtomicReference result = new AtomicReference<>(description);if(StringUtils.isBlank(description)){returnresult.get();

}

paramsMap.entrySet().parallelStream().forEach(p->{if(result.get().contains(p.getKey())){

result.set(result.get().replaceAll(p.getKey(), p.getValue()+ ""));

}

});returnresult.get();

}public static void resolveArgs(JoinPoint joinPoint, ListargNameList, Object[] argObjects,

MapparamsMap){for(int i = 0; i < argNameList.size(); i++){

Class> classo =argObjects[i].getClass();if(handleClassType(classo.getName())){

paramsMap.put(argNameList.get(i),joinPoint.getArgs()[i]);continue;

}JSONObject object=(JSONObject) JSONObject.toJSON(joinPoint.getArgs()[i]);

object.keySet().parallelStream().forEach(p->{

paramsMap.put(p,object.get(p));

});

}

}public static T get(Classclz,Object o){if(clz.isInstance(o)){returnclz.cast(o);

}return null;

}public static booleanhandleClassType(String name){

AtomicBoolean result= new AtomicBoolean(false);

String[] className= {"String","Integer","Long","int","float","double","char"};

Arrays.asList(className).forEach(n->{if(name.contains(n)) {

result.set(name.contains(n));

}

});returnresult.get();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值