Поймать любой вызов, сделанный с типом в качестве параметра с AspectJ - PullRequest
3 голосов
/ 30 августа 2011

Я пытаюсь нормализовать URI в приложении, используя AspectJ. Я хотел бы перехватить каждый вызов метода, передаваемый в параметре java.net.URI.

Простой pointcut для этого будет выглядеть примерно так: public pointcut uriMethod (URI uri): вызов (* * (..)) && args (uri);

Однако, похоже, это соответствует только сигнатурам метода только с одним аргументом (URI). Я могу изменить часть args на «args (uri, ..)», но это применимо только к методам с несколькими аргументами (потеря подписей с одним аргументом) и только если первый аргумент является URI.

Можно построить точечный разрез, чтобы охватить все случаи: public void exampleMethod1 (URI uri); public void exampleMethod2 (URI uri, String s); public void exampleMethod3 (int i, URI uri); public void exampleMethod4 (float f, URI uri, short s);

Бонусные баллы, если возможно захватить несколько URI с одним и тем же pointcut: public void exampleMethod5 (URI uri1, URI uri2);

Я тоже открыт для альтернативных маршрутов. Возможно, мне нужно что-то, основанное на самом классе URI, а не на классах, в которые оно передается?

1 Ответ

1 голос
/ 30 августа 2011

Это выражение pointcut удовлетворит ваше первое условие:

execution(* *(..,java.net.URI,..))

затем в посоветуйте, используйте joinpoint для навигации по args, получите arg с URI в качестве экземпляра - этот вид удовлетворяет вашему второму условию:

    @Around("methodsWithURI()")
public void aroundMethodsWithURI(ProceedingJoinPoint joinpoint){
    for(Object objArg: joinpoint.getArgs()){
        if (objArg instanceof URI){
            System.out.println(objArg);
        }
    }
}
...