2013-03-09 10 views
23

È facile prendere a method Name di un Class in fase di esecuzione
MA
Come posso ottenere un JavaDoc di un metodo in fase di esecuzione?Come ottenere un JavaDoc di un metodo in fase di esecuzione?

Come il seguente esempio

nostra classe che includono JavaDoc del nostro metodo di destinazione

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

} 

nostra classe che ha un metodo 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 
    } 
} 
+1

Cosa intendi con "in fase di esecuzione"? La risposta breve è che non lo fai. –

+0

Per quale scopo? L'utente che esegue il programma quasi certamente non è un programmatore: a che serve mostrargli Javadoc? – EJP

+0

Questa è in realtà una nuova [funzione] (http://sergiodelamo.es/preview-of-groovy-3/) per Groovy 3. Potrei vedere questo diventando un nuovo modo di fornire documentazione per le API di riposo. Ad esempio usando lo swagger. –

risposta

12

Non è possibile: il file class non contiene i commenti.

Una "soluzione" sarebbe generare il javadoc come HTML quando si crea il programma e creare un URL dal nome della classe e dal nome del metodo. È anche possibile generare javadoc in un formato più adatto di HTML utilizzando doclet API.

+0

Qui viene fornito un utile "how-to" per l'utilizzo dell'API doclet: http://stackoverflow.com/a/12872074/119259 –

+0

Vedere le risposte personalizzate per le annotazioni di Abhi. Offre un approccio più semplice senza richiedere Internet. – Johannes

+0

@Johannes Tranne Abhi non risponde alla domanda, che riguardava la javadoc, non altre parti della classe ... –

2

I commenti non hanno una rappresentazione in bytecode, vengono eliminati dal compilatore e non sono disponibili "in fase di esecuzione".

3

È possibile run javadoc programmatically e passare le opzioni per generare documentazione per la classe desiderata e quindi analizzare il documento generato per ottenere la documentazione per il metodo desiderato. Avrai bisogno del codice sorgente in fase di esecuzione perché i commenti non sono nel file di classe.

+0

avendo difficoltà a trovare una riga di comando per questo ..anche per eseguire dall'interno dell'applicazione:/ –

21

L'unico modo per ottenerlo in fase di esecuzione è utilizzare le annotazioni personalizzate.

Creare una classe di annotazione personalizzata:

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

utilizzare su un metodo di una classe, ad esempio:

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

Ispezionare le annotazioni attraverso la riflessione:

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

potresti fornire un esempio di pls? –

+3

ha aggiornato il post. Grazie – Abhi

+0

grazie! btw: 'RetentionPolicy.RUNTIME'' ElementType.METHOD' –

1

processori di annotazione avere accesso ai commenti Javadoc nel codice sorgente. Se si ha il controllo sul processo di compilazione per le classi di cui si desidera utilizzare Javadoc, è possibile utilizzare un processore di annotazione per acquisire Javadoc in fase di compilazione e renderlo disponibile successivamente in fase di runtime.

Questo è l'approccio utilizzato nel progetto therapi-runtime-javadoc (divulgazione: che ho scritto e sto senza vergogna).