2013-03-09 26 views
23

它容易得到Classa method Name在運行時

我如何在運行時獲取的方法的JavaDoc如何在運行時獲取方法的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 
    } 
} 
+1

你是什麼意思,「在運行時」?簡短的回答是,你沒有。 – 2013-03-09 15:14:12

+0

爲了什麼目的?運行該程序的用戶幾乎可以肯定不是程序員:向他展示Javadoc要做的事情有什麼好處? – EJP 2013-03-11 00:25:38

+0

這實際上是groovy 3的一個新功能(http://sergiodelamo.es/preview-of-groovy-3/)。我可以看到這成爲爲rest api提供文檔的新方法。例如使用招搖。 – 2017-06-30 11:17:56

回答

12

您不能:在class文件不包含評論。

「解決方案」是在構建程序時將javadoc生成爲HTML,並根據類的名稱和方法的名稱構建URL。您也可以使用doclet API以比HTML更適合的格式生成javadoc。

+0

這裏提供了一個很好的使用doclet API的「操作方法」:http://stackoverflow.com/a/12872074/119259 – 2014-11-24 05:30:11

+0

查看Abhi的自定義註釋答案。它提供了一個更簡單的方法,不需要Internet。 – Johannes 2017-06-02 07:27:52

+0

@Johannes除了Abhi沒有回答這個問題,這是關於javadoc,而不是該課程的其他部分... – 2017-06-05 06:09:28

2

評論在字節碼中沒有表示,它們被編譯器剝離出來,並且在「運行時」不可用。

3

您可以run javadoc programmatically並傳遞選項以生成所需類的文檔,然後解析生成的文檔以獲取所需方法的文檔。您將需要運行時的源代碼,因爲註釋不在類文件中。

+0

很難找到這個命令行..甚至可以從應用程序中運行:/ – 2017-04-25 20:13:59

21

在運行時獲取它的唯一方法是使用自定義註釋。

創建一個自定義的註釋類:

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

使用它在一個類的方法,如:

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

你能提供一個例子嗎? – 2014-02-20 11:34:34

+3

更新了帖子。謝謝 – Abhi 2014-02-20 19:31:26

+0

thx! btw:'RetentionPolicy.RUNTIME'' ElementType.METHOD' – 2017-04-25 18:57:33

1

註解處理器:

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

通過反射檢查註解有權訪問源代碼中的Javadoc評論。如果您可以控制您感興趣的Javadoc類的編譯過程,那麼您可以使用註釋處理器在編譯時抓取Javadoc,並稍後在運行時使其可用。

這是在therapi-runtime-javadoc項目中使用的方法(披露:我撰寫並且無恥地插入)。

相關問題