【问题标题】:How to get a JavaDoc of a method at run time?如何在运行时获取方法的 JavaDoc?
【发布时间】:2013-02-25 01:47:02
【问题描述】:

在运行时很容易获得Classa method Name
但是
我如何在运行时获得方法的JavaDoc

如下例

我们的类,包括我们的目标方法的JavaDoc

public class MyClass {
    /**
     * 
     * @param x value of ....
     * @return result of ....
     */
    public String myMethod(int x) {
        return "any value";
    }

}

我们的类有一个 main 方法

public class TestJava {
    public static void main(String[] args) {
        // get Class method Name at run time
        String methodName = MyClass.class.getMethods()[0].getName();
        System.out.println(methodName); // will print myMethod
        // How to  get a JavaDoc of myMethod `method` at run time
        // MyClass.class.getMethods()[0].????
        // expected to print a JavaDoc of myMethod
    }
}

【问题讨论】:

  • “在运行时”是什么意思?简短的回答是你没有。
  • 出于什么目的?运行程序的用户几乎可以肯定不是程序员:向他展示 Javadoc 的用途有什么好处?
  • 这实际上是 groovy 3 的新 feature。我可以看到这将成为一种为 rest api 提供文档的新方法。例如使用招摇。

标签: java oop runtime javadoc


【解决方案1】:

在运行时获取它的唯一方法是使用自定义注解。

创建自定义注解类:

@Retention(RUNTIME)
@Target(value = METHOD)
public @interface ServiceDef {
  /**
   * This provides description when generating docs.
   */
  public String desc() default "";
  /**
   * This provides params when generating docs.
   */
  public String[] params();
}

在类的方法上使用它,例如:

@ServiceDef(desc = "This is an utility class",
            params = {"name - the name","format - the format"})     
public void read(String name, String format)

通过反射检查注解:

for (Method method : Sample.class.getMethods()) {
  if (Modifier.isPublic(method.getModifiers())) {
    ServiceDef serviceDef = method.getAnnotation(ServiceDef.class);
    if (serviceDef != null) {
      String[] params = serviceDef.params();
      String descOfMethod = serviceDef.desc();
    }
  }
}

【讨论】:

  • 你能提供一个例子吗?
  • 最大的问题还是要同步/维护 javadoc 和注解字符串常量
  • 我会推荐两个独立的注解,可能是@Params 和@Brief
【解决方案2】:

您不能:class 文件不包含 cmets。

“解决方案”是在构建程序时将 javadoc 生成为 HTML,并根据类名和方法名构建 URL。您还可以使用doclet API 以比 HTML 更合适的格式生成 javadoc。

【讨论】:

  • 这里提供了一个很好的使用 doclet API 的“操作方法”:stackoverflow.com/a/12872074/119259
  • 查看 Abhi 的自定义注释答案。它提供了一种更简单的方法,无需互联网。
  • @Johannes 除了 Abhi 没有回答这个问题,这是关于 javadoc,而不是类的其他部分......
【解决方案3】:

注释处理器可以访问源代码中的 Javadoc cmets。如果您可以控制对 Javadoc 感兴趣的类的编译过程,则可以使用注解处理器在编译时获取 Javadoc,然后在运行时使其可用。

这是therapi-runtime-javadoc 项目中使用的方法(披露:这是我编写的,我无耻地插入)。

【讨论】:

  • 一个有趣的方法。现在稍晚一点,你有生产经验吗?
  • @ThorbjørnRavnAndersen 在therapi-json-rpc 项目中运行良好。至于经验教训,0.4.0 版将 Javadoc 存储在 JSON 类路径资源中,而不是生成的 Java 类中。这会生成更小的 JAR,并且对类加载器更友好。注释处理器和运行时库现在是独立的工件,以提供更大的灵活性。这是我的激情项目之一,我尝试快速回复issues
  • 嗨@dnault,是否也可以使用这种方法访问javadoc警告和错误? Fx 链接到另一个类,但有拼写错误。 IDE 会突出显示类似的东西,但我还没有找到 AbstractProcessor 和访问者/扫描器访问它的方法。我正在使用本指南/示例:alvinalexander.com/java/jwarehouse/openjdk-8/langtools/test/…
  • @Hervian 我认为这对您没有帮助。如果您确实发现了一种访问导入的可移植方式以便您可以验证链接,我很想听听它:-)
【解决方案4】:

您可以run javadoc programmatically 并传递选项以生成所需类的文档,然后解析生成的文档以获取所需方法的文档。由于 cmets 不在类文件中,因此您将在运行时需要源代码。

【讨论】:

  • 很难为此找到命令行.. 甚至从应用程序内部运行:/
【解决方案5】:

注释在字节码中没有表示形式,它们会被编译器删除,并且“在运行时”不可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2018-12-27
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多