没有名称的 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_SUPPORTED")
但是,如果您的参数应该与字符串不同,那么这可能是错误的解决方案。这就是为什么您应该查看 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);
我一直在使用 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_SUPPORTED")
但是,如果您的参数应该与字符串不同,那么这可能是错误的解决方案。这就是为什么您应该查看 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);