我在Java项目中使用的常用实用程序中存在设计问题,我希望确保特定方法A的所有调用者都被另一个方法B包装。此代码的一般形式为I'今天写的是:
x.B(new Runnable() {
y.A();
});
B正在执行的runnable可以有任意代码,并且可以多次调用A,所以我无法通过将对A的调用直接添加到B中来摆脱此代码中的runnable。此外, A是第三方代码,因此我们无法对其进行修改。可行的是,runnable可以再次使用另一个嵌套的A调用来调用B,但是今天这种情况从未发生过,所以我现在可以忽略这种情况了。
我看到了几个选项:
A() throws BlahException
并使其成为B是该异常的唯一捕手。这很丑陋,因为没有任何应该真正抛出的异常,但它很好,因为编译器会确保我的调用层次结构。我还有其他选择吗?
答案 0 :(得分:2)
您是否考虑过使用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();
}
}