Ahmed Nabil
Ahmed Nabil

Reputation: 18986

How to get a JavaDoc of a method at run time?

Its easy to get a method Name of a Class at run time
BUT
How i can get a JavaDoc of a method at run time ?

As the following example

Our Class that include JavaDoc of our target method

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

}

Our Class that has a main method

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
    }
}

Upvotes: 35

Views: 20132

Answers (5)

dnault
dnault

Reputation: 8899

Annotation processors have access to the Javadoc comments in the source code. If you have control over the compilation process for the classes whose Javadoc you are interested in, you can use an annotation processor to grab the Javadoc at compile-time and make it available later at runtime.

This is the approach used in the therapi-runtime-javadoc project (disclosure: which I authored and am shamelessly plugging).

Upvotes: 20

Liam
Liam

Reputation: 2837

The only way to get it at runtime is to use custom annotations.

Create a custom annotation class:

@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();
}

Use it on a method of a class, e.g.:

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

Inspect the annotations via reflection:

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();
    }
  }
}

Upvotes: 24

Lie Ryan
Lie Ryan

Reputation: 64845

You can run javadoc programmatically and passing options to generate documentation for the class that you want and then parsing the generated document to get the documentation for the method that you want. You will need the source code at runtime because comments are not in the class file.

Upvotes: 4

cara
cara

Reputation: 1042

Comments do not have a representation in bytecode, they get stripped out by the compiler and aren't available "at runtime".

Upvotes: 3

Denys Séguret
Denys Séguret

Reputation: 382160

You can't : the class file doesn't contain the comments.

A "solution" would be to generate the javadoc as HTML when you build your program and to build an URL from the name of the class and the name of the method. You could also generate the javadoc in a more suitable format than HTML using the doclet API.

Upvotes: 14

Related Questions