You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Spoon获取文档注释中的非Javadoc标签原文

保留Spoon处理中的自定义Javadoc标签

我完全理解你遇到的困扰:Spoon默认会把非标准的Javadoc标签(比如你的@abc:xyz)替换成@unknown,这直接打断了后续对自定义标签的过滤和处理流程。下面是解决这个问题的具体方案:

问题根源

Spoon的默认Javadoc解析器只识别官方定义的标准标签(比如@return@param这类),对于自定义标签,它会自动将其替换为@unknown,导致原始标签内容丢失。要保留自定义标签,我们需要替换默认的Javadoc注释处理器,让它保留未知标签的原文。

解决方案步骤

1. 自定义Javadoc注释处理器

创建一个自定义的处理器类,覆盖默认的未知标签处理逻辑,遇到自定义标签时直接保留原始文本:

package tryspoon;

import spoon.javadoc.JavadocCommentProcessor;
import spoon.javadoc.api.elements.JavadocTag;
import spoon.support.javadoc.DefaultJavadocTagFactory;

public class CustomJavadocProcessor extends JavadocCommentProcessor {
    @Override
    protected JavadocTag createUnknownTag(String tagName, String content) {
        // 不替换为@unknown,直接返回原始的自定义标签内容
        return DefaultJavadocTagFactory.createCustomTag(tagName, content);
    }
}

2. 在Spoon Launcher中注册自定义处理器

修改你的Spooner.java代码,在构建模型前注册这个自定义处理器,替换掉默认的Javadoc处理逻辑:

package tryspoon;

import spoon.Launcher;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.visitor.filter.TypeFilter;

public class Spooner {
    private static final String SAMPLE_SOURCE_PATH = "full_local_path_to_source"; // 替换为你的本地文件实际路径

    public static void main(String[] args) {
        Launcher launcher = new Launcher();
        // 注册自定义Javadoc处理器,覆盖默认行为
        launcher.getEnvironment().setCommentProcessor(new CustomJavadocProcessor());
        launcher.addInputResource(SAMPLE_SOURCE_PATH);
        launcher.buildModel();

        String firstDocComment = launcher.getModel()
                .getElements(new TypeFilter<>(CtMethod.class))
                .get(0).getDocComment();
        System.out.println("First Doc comment contents: " + firstDocComment);
    }
}

验证结果

运行修改后的Spooner.java,输出将会和你期望的一致:

First Doc comment contents: @abc:xyz some-value @return name of husband

这样自定义标签的原文就被完整保留下来,完全可以支持后续的过滤和处理需求了。

内容的提问来源于stack exchange,提问作者jottler189

火山引擎 最新活动