2015-06-24 5 views
0

Я хотел бы, чтобы Aspectj связывал аргументы метода с помощью args.Aspectj необязательное связывание параметров

Что-то вроде этого:

@Before("@annotation(authorized) && args(java.util.String)") 
    public void authorize(JoinPoint joinPoint, Authorized authorized, String str) 

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

Если у рекомендуемого метода нет аргумента String, я хотел бы иметь str, заполненный нулевым значением. Возможно ли это? Или это единственный вариант использования joinPoint.getArgs()?

ответ

1

У меня есть ответ на вопрос, который Вы задали в комментарии к ответу Энди:

было бы возможным методам консультации с неизвестным количеством аргументов, но не заканчивающегося с аргументом определенного типа?

package de.scrum_master.app; 

import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 

@Retention(RetentionPolicy.RUNTIME) 
public @interface Authorized {} 
выход
package de.scrum_master.app; 

public class Application { 
    @Authorized static void bla(String string, int i, int j) {} 
    @Authorized static void baz(String string, int i, Integer integer) {} 
    @Authorized static void zot(String string) {} 
    @Authorized static void bar(Integer integer) {} 
    @Authorized static void foo() {} 

    public static void main(String[] args) { 
     foo(); 
     bar(new Integer(11)); 
     zot("xxx"); 
     baz("yyy", 123, new Integer(22)); 
     bla("zzz", 123, 456); 
    } 
} 
package de.scrum_master.aspect; 

import org.aspectj.lang.JoinPoint; 
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Before; 

import de.scrum_master.app.Authorized; 

@Aspect 
public class MyAspect { 
    @Before("@annotation(authorized) && execution(* *(..)) && !execution(* *(.., Integer))") 
    public void authorize(JoinPoint joinPoint, Authorized authorized) { 
     System.out.println(joinPoint); 
    } 
} 

консоли:

execution(void de.scrum_master.app.Application.foo()) 
execution(void de.scrum_master.app.Application.zot(String)) 
execution(void de.scrum_master.app.Application.bla(String, int, int)) 

Как вы можете видеть, эти два метода baz и barне с окончанием определенного типа - Integer в этом пример - исключают uded от соответствия.

1

Вы можете использовать getArgs(), альтернатива была бы создать несколько советов, которые делегат на функцию вы хотите выполнить:

@Before("@annotation(authorized) && execution(* *())") // no string 
public void authorize(JoinPoint joinPoint, Authorized authorized) { 
    helper(joinPoint,authorized,null); 
} 

// 1 argument, which is the string 
@Before("@annotation(authorized) && execution(* *(..)) && args(str)") 
public void authorize(JoinPoint joinPoint, Authorized authorized, String str) { 
    helper(joinPoint,authorized,str); 
} 

Примечание Я также включая элемент исполнения Pointcut. Это может быть важно включить в это. В противном случае при компиляции с чистым AspectJ ваш pointcut без него может совпадать как с вызовом, так и с точкой выполнения для ваших методов, дважды используя совет.

+0

Я специально ищу совет, который связывается со всеми методами, используя аннотацию. Жаль, я не могу объявить опцию arg. Можно ли советовать методы с неизвестным количеством аргументов, но не заканчивая аргументом определенного типа? (таким образом я могу создать несколько советов для разных аргументов, без их запуска сразу. – Cloud

Смежные вопросы