如何在运行时获取方法的JavaDoc?

ahm*_*l88 27 java oop javadoc runtime

它容易得到a method NameClass在运行时
BUT
我怎样才能得到一个JavaDoc在运行时的方法吗?

如下例所示

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

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

}
Run Code Online (Sandbox Code Playgroud)

我们的类有一个主要方法

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
    }
}
Run Code Online (Sandbox Code Playgroud)

Abh*_*bhi 22

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

创建自定义注释类:

@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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

通过反射检查注释:

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();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 最大的问题仍然是同步/维护javadoc和注释字符串常量 (4认同)

Den*_*ret 12

您不能:该class文件不包含注释.

一个"解决方案"是在构建程序时根据HTML生成javadoc,并根据类的名称和方法的名称构建URL.您还可以使用doclet API以比HTML更合适的格式生成javadoc .


dna*_*ult 8

注释处理器可以访问源代码中的Javadoc注释.如果您可以控制您感兴趣的Javadoc类的编译过程,则可以使用注释处理器在编译时获取Javadoc,并在运行时稍后使用它.

这是在curei-runtime-javadoc项目中使用的方法(披露:我撰写并无耻地插入).

  • @ThorbjørnRavnAndersen 它在 [therapi-json-rpc](https://github.com/dnault/therapi-json-rpc) 项目中运行良好。至于经验教训,0.4.0 版本将 Javadoc 存储在 JSON 类路径资源中,而不是生成的 Java 类中。这会产生更小的 JAR,并且对类加载器更友好。注释处理器和运行时库现在是独立的工件,以提高灵活性。这是我热情的项目之一,我尝试快速回复[问题](https://github.com/dnault/therapi-runtime-javadoc/issues)。 (3认同)