仅使用编译时编织尝试为大量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接口(interface),但是在任何地方都没有toString()方法的迹象。

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

关于如何克服这一点的任何线索?也许是仅针对包@Around之下的子类的截取点上的com.mycompany.dto建议可拦截java.lang.Object.toString()的执行?还是强制混合发生的方法?

最佳答案

我尝试了您的方案并可以复制该行为,还尝试了@DeclareMixin而不是@DeclareParent的组合,但也无法使其正常工作。虽然对我有用,但是以这种方式使用 native aspectj:

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

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

我猜想使用@AspectJ可能不可行,并且只能通过 native 方面实现。

09-10 05:43
查看更多