Внутри findAll()
вы можете проверить текущую трассировку стека, используя Thread.getStackTrace()
и убедиться, что предыдущий StackTraceElement
- это класс и метод, который вы хотите:
public List<Fichier> findAll() {
StackTraceElement[] stack = Thread.getStackTrace();
if(stack.length > 1) {
// stack[0] is ourselves, stack[1] is who called us
if(stack[1].getClassName().equals(...) && stack[1].getMethodName().equals(...) {
// execute the business logic
}
}
}
Просто остерегайтесь нескольких вещей:
- Это проверка во время выполнения, поэтому методы, вызывающие
findAll()
, не будут помечены во время компиляции. - Согласно JavaDocs ,
getStackTrace()
метод может быть не разрешен некоторыми SecurityManager, и некоторые виртуальные машины могут пропускать стековые фреймы в редких случаях. - Это может быть неэффективно, если вы делаете это для каждого запроса.
- Если служба является bean-компонентом Spring, вам, возможно, придется разобраться с прокси-классами, чтобы найти реального вызывающего (т.е.предыдущий кадр стека до
findAll()
может быть сгенерированным пружиной прокси-классом.
Альтернативой может быть использование Aspect Oriented framework.Например, Spring AOP имеет ControlFlowPointcut , который можно использовать для сопоставления имени вызывающего абонента, класса и пакета.Этот подход немного более декларативен, но опирается на дополнительную библиотеку.