您是否考虑过使用
AspectJ或其他一些面向方面编程(AOP)工具?然后你可以拦截方法A的每次调用,检查堆栈跟踪中的方法B.如果它不在那里,你可以抛出异常阻止执行A,或者写一个错误来记录,或做任何你喜欢的事情.像这样的东西:
@Aspect
public class CheckInsideMethodBAspect {
@Around("execution(* com.example.AClass.A(..))")
public void checkNestedMethod(ProceedingJoinPoint joinPoint) {
// checking for method B in the call stack
boolean isInsideB = false;
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
for (StackTraceElement element: stackTraceElements) {
if (element.getClassName().equals("ClassB") && element.getMethodName().equals("B")) {
isInsideB = true;
break;
}
}
// if not inside B, throwing exception
if (!isInsideB) {
throw new NotInsideBException();
}
// if inside B, then proceeding with method A execution
joinPoint.proceed();
}
}