AspectJ JoinPoint вопрос - PullRequest
       1

AspectJ JoinPoint вопрос

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

В настоящее время я использую JoinPoint для захвата параметров, переданных сервисным методам во время выполнения. Хотя JoinPoint помогает мне получить значения параметров, я вижу, что он не предоставляет какого-либо хорошего API для получения имен параметров, типов параметров, отдельных значений параметров, когда переданный параметр является массивом и т. Д.

Вот пример:

public void doIt(String user, Attribute[] attr, Integer[] i, boolean bool, List<Attribute> list){.....}

Для вышеупомянутого метода, когда я использую JoinPoint.getArgs (), я вижу значение мусора для параметра, который является массивом или коллекцией. Если параметр является массивом или коллекцией, как я могу проверить, являются ли они одним из них, и как я могу просмотреть их, чтобы получить отдельные значения?

Есть предложения? Спасибо

Ответы [ 2 ]

21 голосов
/ 20 апреля 2011

Это должно работать:

MethodSignature signature = (MethodSignature)joinPoint.getSignature();
String[] parameterNames = signature.getParameterNames();
Object[] parameterValues = joinPoint.getArgs();

Параметр Имя должен соответствовать тому, что вы передали.

Обновление 1: вы, вероятно, компилируете с отключенными символами отладки - (явно передавая javac -g: none или через флаги в maven / ant) Если символы отладки отключены, имена не будут доступны и будут заменены на args1 и т. Д. Компилятором. Попробуйте с компиляцией с символами отладки, явно не выключенными.

2 голосов
/ 11 апреля 2014

AspectJ pointcut

public pointcut pointcutName():
        execution(* ClassName.method(..));

Получение имен параметров метода

before():pointcutName(){
String[] paramNames = ((CodeSignature) thisJoinPointStaticPart
                .getSignature()).getParameterNames();
 for(String paramName:paramNames){
            System.out.println(paramName);
        }
}

Получение значений параметров:

before():pointcutName(){
Object[] paramValues = thisJoinPoint.getArgs();

for (Object object:paramValues){
        System.out.println(object.toString);
        }
}

Получение метода Возвращаемое значение:

after() returning(Object objectReturn) :pointcutName(){
    System.out.println(objectReturn);
}
...