Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > AspectJ: вызов метода/конструктора с аннотацией


Автор: MaxPayneC 12.3.2010, 10:58
Есть аннотация:
Код

package com.vc.museums.aspects.annotations;

import java.lang.annotation.*;

/**
 * Date: 11.03.2010<br />
 * Time: 15:01:25<br />
 *
 * @author maxpayne
 * @version 1.0
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
@Documented
public @interface InvocationLimitation
{
    /**
     *
     * @return
     */
    //String value();
}


Помеченный ей код:
Код

    @InvocationLimitation
    @Override
    public void setNewsDate(Date newsDate) throws FailedOperationException
    {
        System.err.println("setNewsDate() execution");
        if (newsDate == null)
        {
            throw new IllegalArgumentException(globalsBundle.getString("invalidNullArgument"));
        }

        this.newsDate = newsDate;
        this.isStateSynchronized = false;
    }


Аспект:
Код

package com.vc.museums.aspects;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

/**
 * todo class javadoc
 * <p/>
 * Date: 11.03.2010<br />
 * Time: 15:20:21<br />
 *
 * @author maxpayne
 * @version 1.0
 */
@Aspect
public abstract class InvocationLimitationAspect
{
    @Pointcut("call(com.vc.museums.model.entities.information.PieceOfNewsImpl.new(..))")
    //@Pointcut("cflow(execution(com.vc.museums.model.entities.information.PieceOfNewsImpl+.new (..)))")
    //@Pointcut("cflow(execution(@com.vc.museums.aspects.annotations.InvocationLimitation+.new (..)))")
    public void constructorLimitation()
    {

    }

    @Pointcut("execution(@com.vc.museums.aspects.annotations.InvocationLimitation * *(..))")
    public void annotatedInvocation()
    {

    }

    @Around("annotatedInvocation()")
    //@Around("execution(@com.vc.museums.aspects.annotations.InvocationLimitation * *(..))")
    public void advice(JoinPoint joinPoint)
    {
        //throw new Throwable();
        System.err.println("annotated method invoked");
        //return null;
    }
}

Это все компилируется с помощью мавен плагином aspectj-maven-plugin. Компиляция проходит без ошибок, но вызовы помеченного метода из теста не палятся:
Код

package com.vc.museums.tests;

import com.vc.museums.model.entities.information.PieceOfNewsImpl;
import org.junit.Test;

import java.util.Date;

/**
 * todo class javadoc
 * <p/>
 * Date: 11.03.2010<br />
 * Time: 15:27:20<br />
 *
 * @author maxpayne
 * @version 1.0
 */
public class AspectsTest
{
    @Test
    public void testConstructorInvocationIntercepted() throws Exception
    {
        System.err.println("test invocation");
        PieceOfNewsImpl n = new PieceOfNewsImpl();
        n.setNewsDate(new Date(System.currentTimeMillis()));
    }
}

Первый поинткат палит вызовы конструктора класса, а второй, который должен палить вызовы помеченных аннотацией методов, не работает. Кто подскажет почему?

Автор: MaxPayneC 12.3.2010, 20:54
Проблема решилась - убрал abstract из заголовка класса с аспектом.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)