2015-11-10 68 views
2

我想解析java源代碼文件中的所有方法調用,並將它們與它們各自的類相關聯。首先,我認爲我只需要尋找通過導入語句導入的類(我們公司的準則禁止* - 導入)。然後我可以找出使用這種類型的變量並記錄它們的方法調用。解析方法調用:對其他類的隱式依賴關係

然後我注意到,有像

A.getB().getC() 

結構中的B類實際上從未進口的(因爲它沒有明確使用),但它的功能GETC()被調用(和源代碼以某種方式暗示「取決於」它)。

還有其他這種情況嗎?

回答

1

是的,您可以使用Class.forName(xxx)在運行時加載B類。像這樣:

//get Class object of B 
    Class classB = Class.forName("package.to.B"); 
    //get Method object of C in class 
    Method methodC = classB.getMethod("C", parameterTypes of methodC); 
    //for static method: 
    methodC.invoke(null, args of methodC); 
    //create an instance of class B: 
    Object instanceOfB = classB.newInstance(); 
    // invoke the method C on this instance 
    methodC.invoke(instanceOfB, args of methodC); 
2

顯然,來自同一包的類不會出現在導入語句中。 (您可能已經意識到這一點,但以防萬一)。

另外,使用反射,可能有許多方法可以使用未導入的類(請參閱黑傑克發佈的答案)。

此外,還可以充分直接

package.subpackage.Class 

他們也不進口資格在一份聲明中類。

1

不是您正在尋找的確切答案,但您可能更適合通過現有的庫構建類的抽象語法樹(或類似),而不是嘗試自己解析源代碼。

然後,你將能夠看到你有什麼。

下面是一個例子:

http://spoon.gforge.inria.fr/

有好幾張別人; ANTLR是,Eclipse ...

+0

謝謝。但是,這對我在源代碼文件中查找所有方法調用的任務有何幫助? (我對其他信息不感興趣,只是調用哪些類的方法)。 –

+0

勺子(作爲例子)將建立你的參考:http://spoon.gforge.inria.fr/references.html – Kong

1

您可能intrested在javap

我已經創建A.java,B.java,C.java,D.java fiels:

public class A { 
    public static void main(String[] args) { 
     B b = new B(); 
     b.getC().getD(); 
    } 
} 

和編譯這些類。

現在我們可以使用javap的掩飾的A.class:

javap -c A 

,並得到字節碼:

公共類A { 公開發行A(); 代碼: 0:aload_0 1:invokespecial#1 //方法java/lang/Object。「」 :() 4:返回

public static void main(java.lang.String[]); 
    Code: 
     0: new   #2     // class B 
     3: dup 
     4: invokespecial #3     // Method B."<init>":()V 
     7: astore_1 
     8: aload_1 
     9: invokevirtual #4     // Method B.getC:()LC; 
     12: invokevirtual #5     // Method C.getD:()LD; 
     15: pop 
     16: return 
} 

現在,你可以得到的A.class已經使用導入的類,如:

  • //方法B.getC :()LC; - >使用B類
  • //方法C.getD :()LD; - >使用C類

,但我認爲最好的方法是用Abstract Syntax Tree作爲@Kong,