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

Вопрос короткий и простой: есть ли способ получить объект Method из апсекта 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);

но я не думаю, что это выход...


person Erik    schedule 19.04.2011    source источник


Ответы (2)


Ваш метод не является неправильным, но есть лучший. Вы должны привести к MethodSignature< /а>

MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
person Bozho    schedule 19.04.2011
comment
При использовании в приложении весенней загрузки вышеуказанное приведение не работает. Затем подпись имеет тип MethodSignatureImpl, который является частным внутренним классом Springs MethodInvocationProceedingJoinPoint. - person Heri; 11.06.2015
comment
Обновление комментария выше (что неверно): в моем тесте я импортировал неправильный класс MethodSignature, что привело к исключению ClassCastException. Правильный класс — org.aspectj.lang.reflect.MethodSignature. - person Heri; 12.06.2015
comment
Как я мог сделать это, но вместо того, чтобы получить метод, получить класс, в котором находится метод? Сделал бы это MethodSignature#getDeclaringType()? - person lealceldeiro; 09.08.2018
comment
Но разработчик должен быть уверен, что точка соединения — это метод, а не конструктор, верно? В противном случае ClassCastException. Пожалуйста, поправьте меня, если я ошибаюсь. - person Volkan Okçu; 29.01.2019

Вы должны быть осторожны, потому что 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 добровольно пуст, вам лучше добавить код для управления исключением)

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

person Nordine    schedule 10.02.2012
comment
Я бы проголосовал за вас дважды, если бы мог, один раз за отличный ответ и один раз за jointpoint - person Taylor; 02.05.2017