Получение метода java.lang.reflect.Meod из ProceedingJoinPoint? - PullRequest
42 голосов
/ 19 апреля 2011

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

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

Ответы [ 2 ]

81 голосов
/ 19 апреля 2011

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

MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
42 голосов
/ 10 февраля 2012

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

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

...