0

我第一次尝试使用@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。

4

1 回答 1

1

我认为您需要在 Test 课程中进行演员表:

((CreatedBean)aa).setCreated(new Date());

System.out.println(((CreatedBean)aa).getCreated().toString());

IIRC 的原因是注释样式代码旨在与 javac 编译,它不知道DeclareMixin.

于 2014-09-24T04:17:01.977 回答