2010-02-05 105 views
45

我希望解析java源代碼文件,並提取方法源代碼。Java:解析java源代碼,提取方法

我需要一個像這樣的方法:

/** Returns a map with key = method name ; value = method source code */ 
Map<String,String> getMethods(File javaFile); 

有沒有一種簡單的方法來實現這一目標,一個庫,幫助我建立我的方法,等等?

+0

[roaster](https://github.com/forge/roaster)提供了一個流暢的API來處理Java代碼。 – koppor 2017-05-02 16:02:03

回答

53

http://javaparser.github.io/javaparser/

下載Java解析器你必須寫一些代碼。此代碼將調用解析器......它會回報你一個CompilationUnit:

  InputStream in = null; 
      CompilationUnit cu = null; 
      try 
      { 
        in = new SEDInputStream(filename); 
        cu = JavaParser.parse(in); 
      } 
      catch(ParseException x) 
      { 
       // handle parse exceptions here. 
      } 
      finally 
      { 
        in.close(); 
      } 
      return cu; 

注:SEDInputStream是輸入流的子類。如果需要,您可以使用FileInputStream。


你必須創建一個客人。因爲你的方法是隻關心你的訪問者會很容易:

public class MethodVisitor extends VoidVisitorAdapter 
    { 
     public void visit(MethodDeclaration n, Object arg) 
     { 
      // extract method information here. 
      // put in to hashmap 
     } 
    } 

要調用的遊客,這樣做:

MethodVisitor visitor = new MethodVisitor(); 
    visitor.visit(cu, null); 
+2

很棒的回答。欣賞努力。謝謝。 – glmxndr 2010-02-05 10:49:02

+3

偉大的答案是偉大的。謝謝,它甚至可以幫助人們;) – dantuch 2012-07-13 20:03:33

+2

該項目不再維護。查看http://code.google.com/p/javaparser/issues/detail?id=9#c32這會將您引導至https://github.com/matozoid/javaparser – jedierikb 2013-01-06 17:33:46

2

你可以在JavaDoc中使用自定義doclet嗎?

Doclet.com可能會提供更多信息。

2

JavaCC是Java的「編譯器 - 編譯器」(解析器生成器)。有很多語法文件,其中包括Java 1.5。

3

我想你可以使用ANTLR解析器生成器。

這是非常容易使用和ANTLR網站有很多用Java編寫的例子。

另外它還附帶了一個用於eclipse的插件。

+0

您可以請我加入一些關於如何使用ANTLR提取方法的特定示例嗎?我能夠解析檢索單個標記的Java代碼(例如'public','static','void'...),但是我錯過了下一步。 – 2012-12-02 18:04:20

6

QDOX是一個更輕量級的解析器,這不只是解析直到方法級別,即方法體不被解析爲語句。即使您要瀏覽模型以找到正確的名稱,它也會或多或少地給出您要求的內容,因爲它不會按名稱對類和方法編制索引。

+0

簡單易用。 – ozhan 2012-03-12 15:12:36

+0

更易於使用,並在Maven存儲庫上提供。 – javydreamercsw 2012-11-28 23:27:05

+0

甚至更​​好的授權(Apache 2) – elCapitano 2014-02-08 12:42:15