织里toString()实现使用AspectJ(Weaving in toString() impl

2019-07-18 03:33发布

试图在一个默认toString()方法来编织为大量的DTO的,使用编译时只织。 我们的目标是恢复使用杰克逊库JSON表示。

其次在建议这篇文章 ,把它变成注释风格方面的配置,并结束了与下面的代码:

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 ? 还是有办法来迫使混入的情况发生?

Answer 1:

我想你的情况和可以复制的行为,我也尝试过的组合@DeclareMixin代替@DeclareParent并不能得到这工作的。 什么工作对我来说虽然是使用原生的AspectJ是这样的:

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

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

我猜测,这可能不是使用可行@AspectJ ,并且只能通过本机方面是可行的。



文章来源: Weaving in toString() implementation with AspectJ