Получение java.lang.reflect.Method из ProceedingJoinPoint?

263
29

Вопрос короткий и простой: есть ли способ получить объект Method из apsectj ProceedingJoinPoint?


В настоящее время я делаю


Class[] parameterTypes = new Class[joinPoint.getArgs().length];
Object[] args = joinPoint.getArgs();
for(int i=0; i<args.length; i++) {
if(args[i] != null) {
parameterTypes[i] = args[i].getClass();
}
else {
parameterTypes[i] = null;
}
}

String methodName = joinPoint.getSignature().getName();
Method method = joinPoint.getSignature()
.getDeclaringType().getMethod(methodName, parameterTypes);


но я не думаю, что это путь...

спросил(а) 2011-04-19T12:39:00+04:00 10 лет, 3 месяца назад
1
Решение
370

Ваш метод не ошибается, но там лучше. Вам нужно нажать MethodSignature

MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();

ответил(а) 2011-04-19T14:31:00+04:00 10 лет, 3 месяца назад
269

Вы должны быть осторожны, потому что Method method = signature.getMethod() вернет метод интерфейса, вы должны добавить это, чтобы получить метод класса реализации:


    if (method.getDeclaringClass().isInterface()) {
try {
method= jointPoint.getTarget().getClass().getDeclaredMethod(jointPoint.getSignature().getName(),
method.getParameterTypes());
} catch (final SecurityException exception) {
//...
} catch (final NoSuchMethodException exception) {
//...
}
}

(Код в catch является добровольным пустым, лучше добавить код для управления исключением)


При этом у вас будет реализация, если вы хотите получить доступ к аннотациям метода или параметра, если они отсутствуют в интерфейсе

ответил(а) 2012-02-10T18:28:00+04:00 9 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема