我现在正在使用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手册。在那里,他提到他甚至正在考虑弃用@DeclareParents
的defaultImpl
论点,以支持@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 讨论为您的问题提交错误票证是否有意义,或者他是否无论如何都不会修复它,因为有一个可行且推荐的替代方案。