2011-03-21 101 views
3

我想創建一些基於Java代碼(而不是字節碼)的反向egineered設計文檔,而不是編寫我自己的解釋器,使用什麼工具和API來遍歷Java代碼,使用Java代碼?獲取關於Java源代碼元數據的Java API

反射是在字節碼上,並且僅限於方法級別,我想「objectize」也是方法代碼。

Java文檔被忽視代碼本身,只根據意見,自動UML sequnces過於嚴格

例如像這樣的API(原諒我的官方編程語言結構方面的無知):

JavaCodeDom jcd = new JavaCodeDom(new File(pathToJavaSource), CompilerEnum.Java16) 
List <ClassSrc> classes = jcd.getClasses(); 
ClassSrc cls = classes.get(0); 
Map<MethodSignatureSrc,MethodSrc> methods = cls.getMethodsMap(); 
MethodSrc main = mothds.get(new MethodSignatureSrc(Modifiers.Public, Modifiers.Static, ReturnTypes.Void, "main", new MethodParams(String[].class)) 
List<StatementSrc> statements = main.getStatements(); 
for(StatementSrc statement : statements){ 
    if(statement.getType()==StatementTypes.Assignment()){ 
     AssignmentStatementSrc assignment = (AssignmentStatementSrc)statement; 
     Identifier src = assignment.getAssigneeVariable(); 
     ExpressinoSrc = assignment.getAssignmentValue(); 
    } 
} 
List<AnnotationsSrc> annotations = cls.getAnnotations(); 

回答

3

存在幾種這樣的API(並隨JDK一起提供),其中一些API內建於Java Compiler(javac)中。

  • 最廣泛的是Compiler Tree API,它允許您訪問Java源代碼中的單個表達式(和子表達式)。
  • language model API模型類型和類型的成員(構造函數,方法,字段) - 它由編譯器樹API使用,也用於註釋處理。它不允許訪問方法的內容。
  • 當然,在運行時您有反射API(java.lang.Classjava.lang.reflect.*,連同java.lang.annotation)。
  • 要使用編譯器樹API,必須調用編譯器,並使用compiler API
  • 此外,Javadoc還有Doclet API,它爲您提供了類似於語言模型API的視圖,但另外還提供了文檔註釋(和解析標籤)。

我曾經使用Doclet API和編譯器樹API的組合來精美地格式化源代碼(這不是在線,很遺憾)。

+0

謝謝,現在我只需要知道如何使用它;)看到我的後續問題在這裏:http://stackoverflow.com/questions/5373199/examples-tutorials-for-usage-of-javax-lang-model-or-antlr-javaparser-to-get-inf – 2011-03-21 03:00:15

+0

我會看看我的Doclet,看它是否處於待發布狀態。 ..但不是現在,我應該幾個小時前已經睡覺了。 – 2011-03-21 03:06:18

0

我看來ANTLR是一種選擇,但我沒有用它

+0

ANTLR可以解析Java源代碼。它看起來像海報想要遍歷編譯的類。 – 2011-03-21 01:07:47

+0

@Andy - 謝謝,我是作者(回答我自己的問題),但我想遍歷源不編譯類 – 2011-03-21 01:37:37

+0

哦!我實際上使用過ANTLR。我運行了現有的Java語法,但不記得支持哪種Java語言版本,並且Java 7正在進行更改。您可能可以將其用作起點,並添加自己的操作。我推薦ANTLR作者的書「The Definitive Antlr Reference:Building Domain-Specific Languages」。「 – 2011-03-21 02:53:56

2

BCEL支持讀取操作的Java類文件。 (我沒有用它自己,但看到它在第三方產品成功使用。)

The Byte Code Engineering Library is intended to give users a convenient 
    possibility to analyze, create, and manipulate (binary) Java class files 
    (those ending with .class). Classes are represented by objects which 
    contain all the symbolic information of the given class: methods, 
    fields and byte code instructions, in particular. 

如果你在反編譯只是有興趣,你可能會發現它足以反編譯源代碼。這是comparison of several options for Java

+0

謝謝,但我對源代碼信息感興趣,而不是編譯類 – 2011-03-21 01:38:31