张晓波
2023-09-19 164694c47c35d6654df69b533e8dbf8b5423efc5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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);
    }
}