我试图在IntelliJ IDEA的示例项目中使用AspectJ.我有使用 Spring AOP的经验,但这是我第一次使用AspectJ,并且无法使其工作.

我想按照这里描述的方式去做:https://www.jetbrains.com/help/idea/2017.1/aspectj.html

我的build.gradle:

apply plugin: 'java'

repositories
{
    mavenCentral()
}

dependencies
{
    compile "org.projectlombok:lombok:+"

    compile "org.aspectj:aspectjrt:+"
    compile "org.aspectj:aspectjweaver:+"
    compile "org.aspectj:aspectjtools:+"
}

buildscript
{
    repositories
    {
        maven
        {
            url "https://maven.eveoh.nl/content/repositories/releases"
        }
    }

    dependencies
    {
        classpath "nl.eveoh:gradle-aspectj:+"
    }
}

project.ext
{
    aspectjVersion = '+'
}

apply plugin: 'aspectj'

我的方面:

package aspects;

import lombok.SneakyThrows;
import lombok.experimental.FieldDefaults;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;

import java.util.Arrays;

@Aspect
@FieldDefaults(makeFinal = true)
public aspect LoggingAspect
{
    Journal journal = Journal.INSTANCE;

    pointcut all(ProceedingJoinPoint proceedingJoinPoint) : execution(* * set*(..) );

    around() : all(ProceedingJoinPoint proceedingJoinPoint)
    {
        System.out.println("asd");
    }

    @SneakyThrows
    @Around("execution(* * repository.*.*(..))")
    public Object log(ProceedingJoinPoint proceedingJoinPoint)
    {
        journal.write(proceedingJoinPoint.getThis().getClass().getCanonicalName());
        journal.write("\n");

        String arguments = Arrays
            .stream(proceedingJoinPoint.getArgs())
            .map(o -> o.getClass().getCanonicalName() + " " + o.toString())
            .reduce(new StringBuilder(),StringBuilder::append,StringBuilder::append)
            .toString();

        journal.write(arguments);
        journal.write("\n");

        long start = System.currentTimeMillis();

        Object result = proceedingJoinPoint.proceed();

        journal.write(result.toString());
        journal.write("\n");

        journal.write(String.valueOf(System.currentTimeMillis() - start));
        journal.write("\n\n");
        journal.flush();

        return result;
    }
}

样本类:

package repository;

import java.io.Serializable;

public class Task implements Serializable
{
    private static final long serialVersionUID = 1L;

    enum Status {NEW,IN_PROGRESS,FINISHED};

    private Integer id;
    private String description;
    private Employee assignee;
    private Employee reporter;
    private Status status;

    public Task(final Integer id,String description,final Employee assignee,final Employee reporter) {
        this.id = id;
        this.assignee = assignee;
        this.reporter = reporter;
        this.description = description;
        this.status = Status.NEW;
    }

    public Employee getAssignee() {
        return assignee;
    }

    public void setAssignee(Employee assignee) {
        this.assignee = assignee;
    }

...
}

我有IntelliJ IDEA Ultimate 2017.2,它正确地暗示所有方法(吸气剂和制定者)都是我的减产.它还暗示我,对于我的方面的“日志”建议,有多个减少点.但是,它没有暗示“所有”建议.

我安装了(在最新版本中)插件,如:
– AspectJ支持
– AspectJ weaver
– Spring AOP / @ AspectJ

Gradle依赖项自动为此项目创建库,因此我没有复制它.

我启用了:Build> AspectJ编织.

设置>构建,执行,部署>编译器> Java编译器:

使用编译器:ajc

Ajc编译路径:/home/me/.gradle/caches/modules-2/files-2.1/org.aspectj/aspectjtools/1.8.10/5c5957ee4615bde33b54ce965f5b85b8827b97d5/aspectjtools-1.8.10.jar

命令行参数:为空

生成调试信息:已选中

委托给javac:chcecked

启用注释处理选项:选中

项目构建和编译没有问题.它运行就像从来没有任何方面,特殊性没有从方面打印出来,也没有创建临时文件,并且所有方法运行良好(尽管在我的“所有”建议中,我没有处理关节点).

当我在任何建议的第一行创建断点并使用调试器运行项目时,不会捕获任何内容.

我错过了什么?

解决方法

在浪费了更多时间之后,我发现我将两个截然不同的AspectJ sytnax混合在一起.

一个是方面(如“public aspect LoggingAspect”),第二个是常规Java注释(如“@Aspect”或“@Around”).

当我用“公共类LoggingAspect”替换“public aspect LoggingAspect”时,它起作用了.很难找到,因为一切仍然没有问题编译.

希望它有一天能帮到某人,或者至少在将来的ajc版本中会增加更多详细的编译器输出.

java – IntelliJ IDEA AspectJ的更多相关文章

  1. android – 在IntelliJ中减小调试APK的大小

    我正在合作开发具有9个Android库和10个jar库的中型Android项目.我在IntelliJ中开发,我的协作者在Eclipse中工作.在Eclipse中,调试APK的大小约为2.5MB,在IntelliJ中它是20MB.这怎么可能?我可以在IntelliJ中减小APK的大小,以便更快地将其上传到设备中吗?解决方法APK是一个zip文件.将扩展名更改为.zip并解压缩.看看里面有什么.

  2. “所选目录不是Android SDK的有效主页”IntelliJ 2017

    我正在尝试执行最新AndroidSDK和IntelliJ2017CE的全新安装.我按此顺序做了一些事情:>安装IntelliJ2017CE>安装JDK1.8.x.>使用最新的自制程序说明安装AndroidSDK>在IntelliJ中设置JDK位置>尝试在IntelliJ中设置AndroidSDK位置.最后一步给出了标题中提到的错误.SDK位于/usr/local/share/android-sdk

  3. 检查android sqlite和IntelliJ

    我开始使用以编程方式创建的sqlitedb的小应用程序.当应用程序在模拟器上运行时,有没有办法检查该数据库?

  4. android – 如何使用IntelliJ IDEA正确配置AdMob?

    我正在尝试将AdMob合并到我的Android应用程序中.我正在使用IntelliJIDEA进行开发,我似乎无法正确设置我的项目.此时我已完成以下操作:>是否需要下载AdMobSDK所需的所有初步步骤.>按照指示here,试图为IntelliJIDEA增加它们.我已将AdMobSDK的单入口模块库依赖项添加到我的项目中.如果我尝试在代码中使用它,IDE看起来像是没有问题识别SDK中的类.但是,它无

  5. android – Intellij无法在Genymotion上运行应用程序(但可以启动它)

    我尝试使用genymotion而不是emulator.但是在安装了genymotion和intellij插件之后,我发现我无法在genymotion上运行app.我选择的目标设备是“Showchooserdialog”但是没有genymotion即使我可以用插件启动genymotion.intellij的版本是12.1.4,genymotion是1.1.0.解决方法我刚解决你遇到的同样问题.首先,

  6. android-studio – Android Studio / IntelliJ IDEA编辑器中的中心代码

    我想将我的代码集中在AndroidStudio的/Intellij编辑器中,就像在distractionFree模式下完成一样.现在如果它始终在编辑器的左侧对齐,但我想将它放在窗口的中心.我在设置中找不到任何选项.这可以在不进入无牵引模式的情况下实现吗?

  7. 从批处理文件打开Android签名向导

    在批处理文件中生成签名的APK…时,如何在AndroidStudio中单击并显示对话框?

  8. Spring学习通过AspectJ注解方式实现AOP操作

    这篇文章主要为大家介绍了Spring学习通过AspectJ注解方式实现AOP操作,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. IntelliJ IDEA 2022.2最新版本激活教程(亲测可用版)永久激活工具分享

    Jetbrains官方发布了 IntelliJ IDEA2022.2 正式版,每次大的版本更新,都会有较大的调整和优化,除本次更新全面拥抱 Java 17 外,还有对IDE UI界面,安全性,便捷性等都做了调整和优化完善,用户体验提升不少,相信后面会有不少小伙伴跟着更新

  10. IntelliJ IDEA 2022.1.1 沒有CVS的过程分析

    这篇文章主要介绍了IntelliJ IDEA 2022.1.1 沒有CVS的过程解析,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

随机推荐

  1. 适用于Xcode,IntelliJ Idea和Phonegap(又名Cordova)的gitignore模板

    有没有人有一个很好的预先推出的gitignore文件用于使用Xcode和PhoneGap的iPhone开发?

  2. swift – 不可用:对于混合型算术,请使用显式类型转换或Strideable方法

    我正在尝试学习Swift,并且正在研究一个在Swift2中工作的旧的Generic示例现在在Swift4中它抱怨道有人可以解释为什么我收到这个错误以及我做错了什么?

  3. android-studio – IDEA中Gradle自动完成的位置在哪里?

    解决方法对于Groovy插件,它可能是Cucumber.我知道Gradle使用Groovy的一些技术和语法,所以我尝试在第一次尝试时安装一些Groovy插件并取得成功.安装此插件的步骤:>在MacOS上:首选项…

  4. android – IntelliJ IDEA认为我的项目的一部分是subversion而不是git,如何解决这个问题?

    解决方法在“设置”中检查项目配置>版本控制.这是配置目录/vcs映射的位置.删除可能存在的任何SVN映射,并确保整个项目映射到Git.顺便说一句,我不知道这怎么可能发生.

  5. Android Studio在启动时修改./idea/vcs.xml

    因为不建议忽略AndroidStudio中的整个.idea文件夹,所以大多数文件都由git跟踪.然而奇怪的是,每次启动后,即使已经存在数十个,也会向vcs.xml添加相同的行.这很快变老了.这种行为是有目的还是仅仅是一个错误?AndroidStudio还可以在启动时阻止它进行此类修改吗?

  6. android – 如何使用IntelliJ IDEA正确配置AdMob?

    我正在尝试将AdMob合并到我的Android应用程序中.我正在使用IntelliJIDEA进行开发,我似乎无法正确设置我的项目.此时我已完成以下操作:>是否需要下载AdMobSDK所需的所有初步步骤.>按照指示here,试图为IntelliJIDEA增加它们.我已将AdMobSDK的单入口模块库依赖项添加到我的项目中.如果我尝试在代码中使用它,IDE看起来像是没有问题识别SDK中的类.但是,它无

  7. android-studio – Android Studio / IntelliJ IDEA编辑器中的中心代码

    我想将我的代码集中在AndroidStudio的/Intellij编辑器中,就像在distractionFree模式下完成一样.现在如果它始终在编辑器的左侧对齐,但我想将它放在窗口的中心.我在设置中找不到任何选项.这可以在不进入无牵引模式的情况下实现吗?

  8. Android图书馆项目Jar IntelliJ IDEA 11

    我正在使用IntelliJIDEA11.如何为我的Android图书馆项目创建一个JAR文件?我有一个相同的Android库项目及其JAR文件.我已经设法从模块设置–>项目设置–>Artifacs->创建一个JAR文件.我试图将我的Jar文件与原始文件进行比较,内容不同.是否可以确认我的程序是否正确?解决方法您可以按照这个link1创建jar来防止这样做.如果您在遵循以前的链接时遇到问题,请遵守此link2

  9. 在Android Studio中的Javadoc中的intellij-idea – 标签

    如果我在AndroidStudio和其他Jetbrains产品中重新格式化代码,那么在某些地方创建了一个小标签.我该如何防范?解决方法标签在空行上生成,以便它们显示在javadoc中.如果你想,你可以在重新格式化代码时关闭它.在AndroidStudio中,转到文件–>设置–>代码样式–>Java–>JavaDoc选项卡–>取消选中生成“”空线这里是文档的样式,没有段落标签,右边是快速文档窗口中的文本.只要考虑到这一点.

  10. android – 强制Idea生成R.Java文件的最简单的方法是什么?

    我试图使用intellij想法运行Android示例应用程序,而R.Java文件缺少表单记事本样本源目录.解决方法确保您的项目根目录中有gen文件夹.如果没有,请自己做一个.

返回
顶部