9

尝试为大量 DTO 编织默认的 toString() 方法,仅使用编译时编织。目标是使用 Jackson 库返回 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() 执行的切入点的建议,仅适用于 package 下的子类com.mycompany.dto?还是一种强制混合发生的方法?

4

1 回答 1

2

我尝试了您的场景并且可以复制该行为,我还尝试了@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,只能通过本机方面来实现。

于 2013-01-11T22:17:25.440 回答