AspectJ @DeclareParents defaultImpl 代码在使用它作为依赖时不使用

AspectJ @DeclareParents defaultImpl code is not used when using it as dependency

我目前正在使用 AspectJ。 我在依赖项中分离了 AspectJ 代码。 在这种依赖关系中,一切都按预期工作。 但是一旦我将它导入另一个项目,只有一些功能不再起作用。 当使用 @DeclareParents 的 defaultImpl 时,接口显示在编译代码中而不是默认实现中。 这是我的代码来展示我的意思(每个代码片段都是它自己的文件):

AspectJ 代码:

public interface IAspect
{
    String hello();
}

public class IAspectDefaultImpl implements IAspect
{
    @Override
    public String hello()
    {
        return "hello";
    }
}
@Aspect
public class AspectJ
{

    @DeclareParents(value = "@SomeAnnotation*", defaultImpl = IAspectDefaultImpl.class)
    private IAspect implementedInterface;
}

目标 Class 在另一个项目中:

@SomeAnnotation
public class MyClass
{
    private final int myValue;

    public MyClass(final int wert)
    {
        this.myValue = wert;
    }


    public int getMyValue()
    {
        return myValue;
    }
}

Maven 抛出我:

The type MyClass must implement the inherited abstract method IAspect.hello()

这意味着它部分起作用。 在查看反编译的 .class 文件时,目标 Class 实际上实现了 IAspect。 IAspectDefaultImpl 中定义的方法仍然缺失。

我的 pom 设置与 this 示例中的一样。

我不确定应该从哪里开始查找错误。 感谢任何帮助。

感谢 MCVE。但是,嘿,你不使用 Git 来提交 7z 或 ZIP 档案,你应该提交源代码。我 forked your project 并修复了该问题,重组并简化了您的 POM,还修复了主要问题。

查看我的 pull request 和其中的提交以获取更多详细信息。


关于您的问题,我可以确认,如果您使用 @DeclareParents 在方面库中的方式,它就会发生。

实际上,根据 AspectJ 维护者 Andy Clement 的说法,@DeclareParents 在使用它提供注释样式的父接口 + 实现时存在某些问题。通过 declare parents 的本机 AspectJ 语法不受此影响,但对于注释式语法 Andy 提供了一个称为 @DeclareMixin 的替代方法,请参阅 AspectJ manual。在那里他提到他甚至正在考虑弃用 @DeclareParentsdefaultImpl 论点以支持 @DeclareMixin.

所以我 bugfix (or workaround) 针对你的问题实际上是替换

@DeclareParents(value = "@de.example.aspect.SomeAnnotation *", defaultImpl = IAspectDefaultImpl.class)
private IAspect implementedInterface;

来自

@DeclareMixin("@de.example.aspect.SomeAnnotation *")
public static IAspect createIAspectImplementation() {
    return new IAspectDefaultImpl();
}

这适用于方面库。

我将与 Andy 讨论为您的问题提交错误票证是否有意义,或者他是否不会修复它,因为有一个可行且推荐的替代方案。