我正在尝试第一次使用@DeclareMixin,或者我做错了什么,或者某个地方有错误。
我已经将示例代码发布到github:https://github.com/benze/AspectJError.git。我也在这里粘贴了一点。
如果我使用反编译器查看ApplyAspect.class的已编译代码,则可以看到ajc已在实现的接口中正确添加。
但是,编译器在Test中抱怨ApplyAspect没有setCreated()或getCreated()方法。
另外,如果我尝试从命令行编译项目,我也会遇到相同的编译错误。
我不确定自己在做什么错,或者@DeclareMixin指令在其他地方是否有错误。
接口CreatedBean.java:
public interface CreatedBean {
public Object getCreated();
public void setCreated(final Object created);
}
实现CreatedBeanImpl.java:
public class CreatedBeanImpl implements CreatedBean{
private Object created;
public Object getCreated(){
return this.created;
}
public void setCreated(final Object created ){
this.created = created;
}
}
方面定义:
@Aspect
public class DeclareMixinAspect {
@DeclareMixin("com.benze.bo.ApplyAspect")
public CreatedBean auditableBeanMixin(){
return new CreatedBeanImpl();
}
}
建议上课(com.benze.bo pkg):
public class ApplyAspect {
private String name = "test class";
}
尝试使用ApplyAspect的类:
public class Test {
public static void main(String[] args) {
ApplyAspect aa = new ApplyAspect();
aa.setCreated(new Date());
System.out.println( aa.getCreated().toString());
System.out.println(aa.toString());
System.out.println("all done");
}
}
pom是非常基本的,仅添加了aspectj插件(和依赖项)。我正在使用AJ 1.8.2。
最佳答案
我认为您需要在Test类中进行强制转换:
((CreatedBean)aa).setCreated(new Date());
System.out.println(((CreatedBean)aa).getCreated().toString());
IIRC的原因是注释样式代码旨在与javac一起编译,而javac不会知道
DeclareMixin
的影响。