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 locationAwareClassChecker, Predicate ignore) { boolean afterSelf = false; boolean afterDeprecated = false; String deprecatedClass = null; StackTraceElement[] stackTrace = (new Exception()).getStackTrace(); List 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); } }