今天在看一个日志切面类的时候,在获取方法参数名称的时候,使用到了Javassist。先上代码:
package com.fuint.common.aspect;
import javassist.ClassClassPath;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;
import org.apache.commons.lang.ArrayUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
/**
* 控制器日志
*/
@Component // 声明组件
@Aspect // 声明切面
@ComponentScan //组件自动扫描
@EnableAspectJAutoProxy // spring自动切换JDK动态代理和CGLIB
public class LogAop {
/**
*自定义日志
*/
private Logger logger = LoggerFactory.getLogger(LogAop.class);
/**
* 打印类method的名称以及参数
* @param point 切面
*/
public void printMethodParams(JoinPoint point){
if (point == null) {
return;
}
try {
// 获取方法的参数值数组。方法名、类型以及地址等信息
String className = point.getTarget().getClass().getName();
String methodName = point.getSignature().getName();
// 重新定义日志
logger = LoggerFactory.getLogger(point.getTarget().getClass());
logger.info("-------------------------"+className+"------------------------------------");
logger.info("methodName = {}", methodName);
// 获取方法的参数值数组
Object[] methodArgs = point.ge