Точечные вырезы AspectJ и рекомендации

#aop #aspectj #pointcut

#aop #аспект j #точечные сокращения #aspectj

Вопрос:

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

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

Например.

Разрешенные категории обуви и носков

но если я попытаюсь добавить овощной товар в инвентарь, он должен выдать мне предупреждение о том, что «категория не разрешена .. / нИтем не будет добавлен в инвентарь» ….. а затем перейти к следующему товару….

Это то, что я написал до сих пор…..

 pointcut deliverMessage() :
    call(* SC.addItem(..));

pointcut interestingCalls(String category) :
    call(Item.new(..)) amp;amp; args(*, *, category);

before(String category): interestingCalls(category) { 
    if(category.equals("Socks")) {       
        System.out.println("category detect: "   category);
    else if(category.equals("Shoes"))
        System.out.println("category detect: "   category);
    else {
        check=true; 
        System.out.println("please check category "   category);
    }
}
  

Ответ №1:

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

Обновить:

Вот пример из AspectJ в действии, опубликованный Manning Publication.

 public aspect ProfilingAspect {
  pointcut publicOperation() : execution(public * *.*(..));
  Object around() : publicOperation() {
    long start = System.nanoTime();
    Object ret = proceed();
    long end = System.nanoTime();
    System.out.println(thisJoinPointStaticPart.getSignature()
        " took "   (end-start)   " nanoseconds");
    return ret;
  }
}
  

Итак, если вы хотите проверить, следует ли вам добавлять элемент, если это разрешенная категория, тогда просто вызовите proceed , в противном случае вы бы просто вернули значение null, возможно.