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



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

方面J代码:

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文件时,目标类实际上实现了 IAspect。 IAspectDefaultImpl中定义的方法仍然缺失。

我的pom设置得像这个例子一样。

我不确定我应该从哪里开始寻找错误。 任何帮助都值得赞赏。

感谢您的 MCVE。但是,嘿,你不使用 Git 来提交 7z 或 ZIP 存档,你应该提交源代码。我分叉了您的项目并修复了它,重组和简化了您的 POM,并修复了主要问题。

有关更多详细信息,请参阅我的拉取请求和其中的提交。


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

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

所以我对您的问题的错误修复(或解决方法(是实际替换

@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 讨论为您的问题提交错误票证是否有意义,或者他是否无论如何都不会修复它,因为有一个可行且推荐的替代方案。

相关内容

  • 没有找到相关文章

最新更新