没有名称的 Javassist 注释 MemberValue

Javassist annotations MemberValue without Name

我一直在使用 javassist 为方法添加注释。我无法添加的唯一注释是:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)

因为它不允许我添加没有值的成员,有什么建议吗?

这就是我到目前为止添加注释的方式:

a = new Annotation("WebResult",  cpp);
a.addMemberValue("targetNamespace", new StringMemberValue("value", cpp));
attr.addAnnotation(a);

问题是a.addMemberValue("TransactionAttributeType.NOT_SUPPORTED");编译不通过,因为语法不正确:

The method addMemberValue(Annotation.Pair) in the type Annotation is not applicable for the arguments (String)

我知道应该有一个值,但是这个注释没有任何值。

我没有尝试过这个解决方案,但是在互联网上我发现关于这个主题的唯一的东西是在 JBoss 开发论坛 中提出的解决方案,你可以找到 here.

根据这个解决方案,他们通过打印来自常规 class 的注释发现“值”是要使用的名称。

所以我建议您尝试此解决方案,然后 post 如果这对您有用,请返回此答案。

a = new Annotation("WebResult",  cpp);
a.addMemberValue("value", new StringMemberValue("TransactionAttributeType.NOT_SUPPORTED", cpp));
attr.addAnnotation(a);

PS:我还建议指定属性的全名,只是为了确保运行时编译器正确(例如 com.my.package.TransactionAttributeType.NOT_SUPPORTED

编辑

我们注意到所提出的解决方案是将 属性 作为字符串添加到注释中 new StringMemberValue("...") 导致此结果:

@TransactionAttribute("TransactionAttributeType.NOT_SUPPORTE‌​D")

但是,如果您的参数应该与字符串不同,那么这可能是错误的解决方案。这就是为什么您应该查看 here Javassist 中 MemberVale 的文档,您可以在其中找到您可以使用的所有子类型。

例如,如果您的参数是 Java Class,您应该这样做:

a.addMemberValue("value", 
      new ClassMemberValue("com.package.classname", cpp));

或者,如果您的成员是一个枚举,您可以使用如下方式将其添加到您的注释中:

  EnumMemberValue emv = new EnumMemberValue(cpp);
  emv.setType("TransactionAttributeType");
  emv.setValue("NOT_SUPPORTED");
  a.addMemberValue("value", emv);