我正在尝试第一次使用@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的影响。

10-08 14:16