如何使用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




