【工作随笔:五】记一个通过线程堆栈控制方法调用的思路

本文介绍了如何在Java中通过线程堆栈(Thread.getStackTrace())来控制方法调用,以防调用者绕过指定API直接调用底层代码。文章通过模拟工具类和调用者,展示了如何增加判断并在运行时检查调用路径,确保正确使用API。
摘要由CSDN通过智能技术生成

前言

有这样一种场景,某些代码存在多层封装而只对外暴露一个调用API。但要考虑调用者绕过这个API调用的可能。

模拟工具类

public class ThreadUtils {

    public static String hello() {
        return "Hello";
    }
}

模拟调用者

public class TestA {

    public static void main(String[] args) {
        System.out.println(ThreadUtils.hello());
    }
}
public class TestB {

    public static void main(String[] args) {
        System.out.println(ThreadUtils.hello());
    }
}

增加判断

考虑通过增加一个isAuth方法,来控制调用

    public static String hello() throws Exception {
        if (!isAuth()) {
            throw new Exception("NOT ALLOW!");
        }
        return "Hello";
    }

    private static boolean isAuth() {
        return false;
    }

Java Thread getStackTrace()方法

方法返回一个代表该线程的堆栈转储堆栈跟踪元素的数组。
这将返回一个零长度数组,如果该线程尚未启动或已经终止。如果返回的数组是非零长度则该数组的第一个元素代表堆栈,这是该序列中的最新的方法调用的顶部。所述阵列的最后一个元素代表堆栈,这是该序列中的至少最近的方法调用的底部。

所以

    private static boolean isAuth() {
        Thread thread = Thread.currentThread();
        StackTraceElement[] stackTrace = thread.getStackTrace();
        for (int i = 3; i < stackTrace.length; i++) {
            if (allow.contains(stackTrace[i].getClassName())) {
                return true;
            }
        }
        return false;
    }

效果展示

TestA.java执行
Hello

Process finished with exit code 0
TestB.java执行
Exception in thread "main" java.lang.Exception: NOT ALLOW!
	at com.rice.util.ThreadUtils.hello(ThreadUtils.java:18)
	at com.rice.test.TestB.main(TestB.java:11)

Process finished with exit code 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值