Вы можете ввести вспомогательный метод, который извлекает метод и имена классов из текущего потока:
private static MethodAndClassName retrieveMethodAndClassName() {
StackTraceElement[] allStackTraces = Thread.currentThread().getStackTrace();
StackTraceElement currentMethod = allStackTraces[2];
return new MethodAndClassName(currentMethod.getMethodName(), currentMethod.getClassName());
}
Обратите внимание, что вызовы методов сложены. Я получаю третий последний вложенный вызов (allStackTraces[2]
), потому что последний вызов (allStackTraces[0]
) - Thread.getStackTrace()
, предыдущий последний вызов (allStackTraces[1]
) - retrieveMethodAndClassName()
и предыдущий перед последним вызовом (allStackTraces[2]
) это то, что вы ищете: метод, который вызвал retrieveMethodAndClassName()
.
MethodAndClassName
- это пользовательский класс, который определяет необходимую информацию для трассировки:
public class MethodAndClassName {
private String method;
private String clazz;
public MethodAndClassName(String method, String clazz) {
this.method = method;
this.clazz = clazz;
}
public String getMethodName() {
return method;
}
public String getClassName() {
return clazz;
}
}
А в вашем клиентском коде используйте его, например:
public User findUser(Long id){
if(id == null || id < 1){
throw new BadRequestException(ReflectionHelper.retrieveMethodAndClassName(), String.format(
"Invalid Id: %d", id));
}
User user = userRepository.findOne(id);
if(user == null){
throw new DataNotFoundException(ReflectionHelper.retrieveMethodAndClassName(), String.format(
"Can't Find User for Id: %d", id));
}
return user;
}