【问题标题】:Iterate complex custom annotation array迭代复杂的自定义注解数组
【发布时间】:2013-04-03 09:08:08
【问题描述】:

我创建了一个嵌套的自定义注释。我的代码在这里

@StatusCode(statusArray = {
          @StatusCodesArray(key="200", value="value is ok"),
          @StatusCodesArray(key="400", value="resource not available"),
          @StatusCodesArray(key="400", value="resource not available"),
          @StatusCodesArray(key="400", value="resource not available")
        })

现在我正在创建 java doc 以通过 Doclet API(here) 显示这些状态代码,但无法交互内部 statusCodes 值,但是我能够像这样迭代简单的注释

AnnotationDesc annotationDesc = getAnnotation(method, "StatusCode");
ElementValuePair[] paramNames = annotationDesc.elementValues(); 

返回 StatusCode 注释的值,但是如何迭代 StatusCodes 值?任何帮助都会得到帮助。

【问题讨论】:

  • 请原谅我,但它有点倒退@StatusCode应该是一个代码,@StatusCodes应该是一个数组。或者可能重命名为@StatusCodeArray 以防止混淆。
  • 谢谢巴特,我已经编辑了这个以防止混淆。

标签: spring annotations javadoc


【解决方案1】:

在尝试了很多之后。我找到了解决方案。有两种方法可以迭代数组注释类型。 首先,如果我们使用 Method API(java.lang.reflect),那么它会非常简单,正如 Marius 在他的回答中所说的那样。

第二个是当我们使用 doclets(导入 com.sun.javadoc.MethodDoc api 和其他)时,它有点棘手。首先获取您的 MethodDoc 对象,然后通过此获取 AnnotationDesc 对象,您将在上述问题中达到 @StatusCode 注释case.假设我有 AnnotationDesc API 的 annotationDesc 对象,然后使用以下代码迭代 &statusCodeArray 注释的值。

        ElementValuePair[] paramNames = annotationDesc.elementValues();
        AnnotationValue[] statusCodes = (AnnotationValue[])paramNames[0].value().value();
        if(statusCodes==null||statusCodes.length==0)
        {
            return statusCodeValue;
        }
        for(AnnotationValue statusCode:statusCodes)
        {
            AnnotationDesc anoDesc=(AnnotationDesc)statusCode.value();
            if(anoDesc==null)
            {
                return statusCodeValue;
            }
            String key=(String)anoDesc.elementValues()[0].value().value();
            String value=(String)anoDesc.elementValues()[1].value().value();

        }

您将在 key 中获得状态代码,在 value 中获得状态注释。

【讨论】:

    【解决方案2】:

    尝试访问您定义的注释;

        // MZ: Parse the status code annotations
        StatusCode statusCodes = method.getAnnotation(StatusCode.class);
        if (statusCodes != null)
        {
            for (StatusCodesArray statusCodeArray : statusCodes.value())
            {
                // MZ: Do your magic
            }
        }
    

    Gl!

    【讨论】:

    • 感谢您的回答 Marius 但由于限制问题,我不能直接使用这些注释接口(StatusCode,StatusCodeArray)名称。注释接口在项目的其他模块中定义,我正在生成文档在任何其他模块中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多