gpt4 book ai didi

java - 使用 AspectJ 编织 toString() 实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:11 26 4
gpt4 key购买 nike

尝试为大量 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 关于拦截 java.lang.Object.toString() 执行的切入点的建议,仅适用于 com.mycompany.dto 包下的子类?或者强制 mixin 发生的方法?

最佳答案

我尝试了您的方案并且可以复制该行为,我还尝试了 @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 方面实现。

关于java - 使用 AspectJ 编织 toString() 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14285591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com