在运行时获取方面的实例

Get instance of aspect at runtime

我是 运行 一个使用基于注释的方面来收集统计信息的命令行应用程序。

是否可以检索方面实例以获取统计信息?或者唯一可能的方法是将统计数据保存为 static 变量并在需要的时候获取它?

@Aspect
public class StatisticsAspect {

    private static final Logger LOGGER = Logger.getLogger(StatisticsAspect.class);
    private final Statistics statistics;

    public StatisticsAspect() {
        statistics = new Statistics();
    }

    // Some code...
}

AspectJ 方面默认是单例,即使用静态变量(如果存储 thread-related 信息,则可能是静态 ThreadLocal)并且可能提供一个很好的静态 getter 方法是一个不错的选择。还有其他实例化模型,但对于它们,您需要以不同的方式声明方面,例如 @Aspect("perthis(execution(* ajia.Account.*(..)))")。总而言之,实例化类型有perthis()pertarget()percflow()percflowbelow()pertypewithin()。如果您的统计数据确实是全球性的,那么您的情况无需担心。

作为替代方案,您也可以将统计信息保存在一个实例变量中,但如果它像您的情况一样是私有的,您还需要为其提供一个 getter 方法,例如 public Statistics getStatistics().在那种情况下,如果您想访问 AspectJ-managed 单例方面实例,您应该使用 Aspects.aspectOf(StatisticsAspect.class),另请参阅 AspectJ manual。然后您将像这样访问数据:

Aspects.aspectOf(StatisticsAspect.class).getStatistics();