将其用作依赖项时,不使用AspectJ @DeclareParents defaultImpl代码

目前,我正在与AspectJ合作。 我在依赖项中分离了AspectJ代码。 在该依赖关系中,一切都按预期工作。 但是,一旦我将其导入另一个项目中,则仅某些功能不再起作用。 使用@DeclareParents的defaultImpl时,该接口显示在已编译的代码中,而不显示默认的Implementation。 这是我的代码,以显示我的意思(每个代码段都是其自己的文件):

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;
}

另一个项目中的目标类:

@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示例中一样。

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

jack11666 回答:将其用作依赖项时,不使用AspectJ @DeclareParents defaultImpl代码

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

请参阅我的pull request及其中的提交以获取更多详细信息。


关于您的问题,如果您像在方面库中一样使用@DeclareParents,我可以确认是否发生了该问题。

实际上,根据AspectJ维护者 Andy Clement 所述,@DeclareParents在使用它以注释样式提供父接口+实现时存在某些问题。通过declare parents进行的原生AspectJ语法不受此影响,但是对于注释样式的语法,Andy提供了一种称为@DeclareMixin的替代方法,请参见AspectJ manual。他在那儿提到他甚至正在考虑弃用defaultImpl的{​​{1}}参数,而推荐使用@DeclareParents

因此,我bugfix (or workaround)所遇到的问题是实际替换

@DeclareMixin

作者

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

这与方面库一起使用。

我将与安迪讨论是否有必要为您的问题提交故障单,或者他是否会因为有可行的建议替代方案而无法解决问题。

本文链接:https://www.f2er.com/2867944.html

大家都在问