如何在不触及源代码的情况下为方法/构造函数参数添加注释?

时间:2015-01-15 16:42:09

标签: json spring annotations aspectj aspect

我正在尝试使用jackson 2将框架对象(无源代码访问)解析为JSON。

class Item {
    public Item(Long id) {}
}

我找到了这个Add annotation to a parameter on a new method created with Javassist,但是这个解决方案基于JavaAssist并且不完全适用:(

底层问题是缺少DefaultConstructors,可以使用@JsonCreator注释以及参数的匹配@JsonProperty注释来解决。

@JsonCreator
class Item {
    public Item(@JsonProperty("id") Long id) {}
}

我设法使用mixin类为许多项子类中的一个实现了这个。

public abstract class ItemChildMixin {
    @JsonCreator
    public ItemChildMixin(@JsonProperty("objId") final Long objId) {
    }
}

然而,为几乎相同内容的所有相关对象编写mixin类似乎是错误的方法,所以我开始研究方面。

将注释添加到项目层次结构中的类很简单:

aspect DeclareJsonCreatorAspect {
    declare @constructor: Item+.new(Long): @JsonCreator;
}

但是,我似乎找不到使用Aspects向构造函数参数添加注释的方法! Aspectj in Action以及谷歌尚未提供答案。 这有可能吗?

1 个答案:

答案 0 :(得分:0)

目前,AFAIK AspectJ(目前为v1.8.4)无法处理方法参数的注释,无论是在切入点还是在ITD(类型间定义)语句中。

对不起,我没有任何好消息,但这是现状。如果您有机会通过ITD声明整个方法,则可以影响完整签名,但是现在无法在现有方法上添加参数注释。如果有帮助,您也可以通过ITD声明默认构造函数。我很确定有一种方法可以达到你想要的效果,也许不是你想象的方式。