package com.thhy.general.config.mysql.tos;
|
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.lang.Nullable;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.function.Predicate;
|
|
public class StackTraceProviderJdk8 implements StackTraceProvider{
|
|
//反射相关的类
|
static final String[] REFLECTION_PREFIXES = {"sun.reflect.", "java.lang.reflect.", "jdk.internal.reflect.","com.thhy.general.config."};
|
//mybatis相关的类
|
static final String[] ibatis_PREFIXES = {"org.apache.ibatis.", "org.mybatis.", "com.tellme.Intercept."};
|
//代理相关的类
|
static final String[] proxy_PREFIXES = {"com.sun.proxy."};
|
|
|
@Nullable
|
@Override
|
public StackTraceElement getCallerPlace(Predicate<String> locationAwareClassChecker, Predicate<String> ignore) {
|
boolean afterSelf = false;
|
boolean afterDeprecated = false;
|
String deprecatedClass = null;
|
|
StackTraceElement[] stackTrace = (new Exception()).getStackTrace();
|
List<StackTraceElement> list = new ArrayList<>();
|
for (StackTraceElement stack : stackTrace) {
|
String stackClassName = stack.getClassName();
|
if(!stackClassName.contains("com.thhy")){
|
//不是本项目的排除
|
continue;
|
}
|
//System.out.println(stackClassName);
|
if (isReflection(stackClassName)) {
|
continue;
|
}
|
if (isIbatis(stackClassName)) {
|
continue;
|
}
|
if (isProxy(stackClassName)) {
|
continue;
|
}
|
if (locationAwareClassChecker.test(stackClassName)) {
|
afterSelf = true;
|
continue;
|
}
|
list.add(stack);
|
//System.out.println(stackClassName);
|
/*if (afterSelf) {
|
if (deprecatedClass == null) {
|
deprecatedClass = stackClassName;
|
}
|
}
|
if (stackClassName.equals(deprecatedClass)) {
|
afterDeprecated = true;
|
}
|
//此处跳出循环
|
if (afterDeprecated) {
|
if (ignore.test(stackClassName)) {
|
continue;
|
}
|
//打印出堆栈信息
|
return stack;
|
}*/
|
}
|
return list.get(0);
|
}
|
|
private boolean isReflection(String stackClassName) {
|
return StringUtils.startsWithAny(stackClassName, REFLECTION_PREFIXES);
|
}
|
|
private boolean isIbatis(String stackClassName) {
|
return StringUtils.startsWithAny(stackClassName, ibatis_PREFIXES);
|
}
|
|
private boolean isProxy(String stackClassName) {
|
return StringUtils.startsWithAny(stackClassName, proxy_PREFIXES);
|
}
|
}
|