private static Method getInvokingMethod(int index) {
try {
StackTraceElement stack[] = Thread.currentThread().getStackTrace();
StackTraceElement parent = stack[index];
Class cls = Class.forName(parent.getClassName());
String methodName = parent.getMethodName();
ClassPool pool = ClassPool.getDefault();
ClassClassPath classPath = new ClassClassPath(cls);
pool.insertClassPath(classPath);
CtClass cc = pool.get(cls.getName());
Class[] paramsTypes = null;
for (CtMethod ctMethod : cc.getMethods()) {
MethodInfo methodInfo = ctMethod.getMethodInfo();
if (!methodName.equals(methodInfo.getName())) {
continue;
}
//int ctMethodLine = methodInfo.getLineNumber(0);
/* 取得方法起始行和结束行,然后对比执行的代码是否在此方法区间内 */
int ctMethodMaxLine = methodInfo.getLineNumber(Integer.MAX_VALUE);
int ctMethodMinLine = methodInfo.getLineNumber(0);
int methodLine = parent.getLineNumber();
/* 探测StackTraceElement中所带的行数是否超出了方法体外*/
if(!(methodLine <= ctMethodMaxLine && methodLine >= ctMethodMinLine)){
continue;
}
CtClass[] ctClass = ctMethod.getParameterTypes();
paramsTypes = new Class[ctMethod.getParameterTypes().length];
for (int i = 0; i < ctClass.length; i++) {
CtClass paramsType = ctClass[i];
//CtPrimitiveType
Class type = null;
String clzzName = null;
if(paramsType.isPrimitive()){
type = ClassUtils.forName(paramsType.getSimpleName(), Thread.currentThread().getContextClassLoader());
}else{
type = ClassUtils.forName((paramsType.getPackageName()+"."+paramsType.getSimpleName()), Thread.currentThread().getContextClassLoader());
}
paramsTypes[i] = type;
}
break;
}
return ReflectionUtils.findMethod(cls,methodName,paramsTypes);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 取上层调用方法
* @return
*/
public static Method getParentInvokingMethod() {
return getInvokingMethod(4);
}
/**
* 取得调用该方法的上层方法
* @return
*/
public static Method getParentInvokingThisMethod() {
return getInvokingMethod(3);
}
导包
import javassist.*;
import javassist.bytecode.CodeAttribute;
import javassist.bytecode.LocalVariableAttribute;
import javassist.bytecode.MethodInfo;
import org.springframework.util.*;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;