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

在运行时很容易获得一个Class a method Name

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

如下例所示

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

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

我们的类有一个主要方法

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

您不能: class文件不包含注释。

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

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

创建自定义注记类:

 @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) 

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

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

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

您可以以编程方式运行javadoc并传递选项以生成所需类的文档,然后解析生成的文档以获取所需方法的文档。 您将需要运行时的源代码,因为注释不在类文件中。

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