使用AspectJ编写toString()实现

时间:2013-01-11 19:47:44

标签: java aop aspectj tostring dto

尝试使用编译时编织在大量DTO的默认toString()方法中编织。目标是使用Jackson库返回JSON表示。

按照this article中的建议,将其转换为注释式方面配置,最后得到以下代码:

public @Aspect class JsonToStringAspect {
    private interface JsonToString {
        public String toString();
    }

    public static class JsonToStringImpl implements JsonToString {
        public String toString() {
            return SingletonJsonEncoder.toJsonString(this);
        }
    }

    @SuppressWarnings("unused")
    @DeclareParents(value = "com.mycompany.dto..*", defaultImpl = JsonToStringImpl.class)
    private JsonToString implementedInterface;
}

在结果类上运行javap表明它们实现了JsonToString接口,但是在任何地方都没有toString()方法的迹象。

如果我将方法名称更改为不与Object.toString()发生冲突的内容(例如toString2()),则会真正添加该方法。

有关如何克服这个问题的任何线索?也许对切入点的@Around建议拦截java.lang.Object.toString()的执行,仅适用于包com.mycompany.dto以下的子类?还是一种迫使mixin发生的方法?

1 个答案:

答案 0 :(得分:2)

我尝试了您的方案并且可以复制行为,我也尝试了@DeclareMixin而不是@DeclareParent的组合,并且无法使其工作。对我来说有用的是以这种方式使用原生的方面:

public aspect JsonToStringAspect {
    private interface JsonToString {}
    declare parents: com.mycompany.dto.* implements JsonToString;

    public String JsonToString.toString() {
        return "Overridden String through JsonToStringAspect";
    }
}

我猜这使用@AspectJ可能不太可行,并且只有通过原生方面才有可能。