未调用方面

aspect is not invoked

我有一个简单的 aspect 应该设置 class 字段的值,它有注释 @GuiceInject

原来我有这个

@GuiceInject(module=RepositoryModule.class)
private IRacesRepository repository;

我希望得到类似的结果

private IRacesRepository repository = GuiceInject.getInstance(IRacesRepository.class);

这是我的方面

public aspect InjectionAspect {

    Object around(): get(@GuiceInject * *) {
        System.out.println(thisJoinPointStaticPart);
        // instantiate object as it supposed to be null originally
        return GuiceInjector.getInstance(thisJoinPoint.getTarget().getClass());
    }
}

据我所知 - 我是 AOP 的新手 - 它应该用方面的代码替换 get 字段的调用。

它编译得很好,但是当我 运行 应用程序时 - 没有任何反应。我得到 NullPointerExceptionreadRaces 方法,因为它保持 null 所以 aspect 没有工作。

我的mainclass看起来像这样

public class Example {
    @GuiceInject(module=RepositoryModule.class)
    private IRacesRepository racesRepository;

    private void execute() {
        System.out.println("List of races: " + racesRepository.readRaces());
    }

    public static void main(String[] args) {
        new Example().execute();
    }
}

有什么问题?注释有这个定义

@Target(ElementType.FIELD)
// make annotation visible in runtime for AspectJ
@Retention(RetentionPolicy.RUNTIME)
public @interface GuiceInject {
    Class<? extends AbstractModule> module();
}

请尝试将切入点语法重新定义为

Object around(): get(@package.subpackage.GuiceInject * *.*) 

正确的字段签名必须指定字段类型、声明类型和名称。如果您的注释在不同的包中,它应该是完全限定的。