@DeclareMixin添加了其他类不可见的方法

时间:2014-09-23 20:54:45

标签: java aspectj ajdt

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

1 个答案:

答案 0 :(得分:1)

我认为您需要在Test类中使用强制转换:

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

System.out.println(((CreatedBean)aa).getCreated().toString());
IIRC原因是注释样式代码可以与javac一起编译,而javac不会知道DeclareMixin的影响。