我想解析java源代碼文件中的所有方法調用,並將它們與它們各自的類相關聯。首先,我認爲我只需要尋找通過導入語句導入的類(我們公司的準則禁止* - 導入)。然後我可以找出使用這種類型的變量並記錄它們的方法調用。解析方法調用:對其他類的隱式依賴關係
然後我注意到,有像
A.getB().getC()
結構中的B類實際上從未進口的(因爲它沒有明確使用),但它的功能GETC()被調用(和源代碼以某種方式暗示「取決於」它)。
還有其他這種情況嗎?
我想解析java源代碼文件中的所有方法調用,並將它們與它們各自的類相關聯。首先,我認爲我只需要尋找通過導入語句導入的類(我們公司的準則禁止* - 導入)。然後我可以找出使用這種類型的變量並記錄它們的方法調用。解析方法調用:對其他類的隱式依賴關係
然後我注意到,有像
A.getB().getC()
結構中的B類實際上從未進口的(因爲它沒有明確使用),但它的功能GETC()被調用(和源代碼以某種方式暗示「取決於」它)。
還有其他這種情況嗎?
是的,您可以使用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);
顯然,來自同一包的類不會出現在導入語句中。 (您可能已經意識到這一點,但以防萬一)。
另外,使用反射,可能有許多方法可以使用未導入的類(請參閱黑傑克發佈的答案)。
此外,還可以充分直接
package.subpackage.Class
他們也不進口資格在一份聲明中類。
不是您正在尋找的確切答案,但您可能更適合通過現有的庫構建類的抽象語法樹(或類似),而不是嘗試自己解析源代碼。
然後,你將能夠看到你有什麼。
下面是一個例子:
有好幾張別人; ANTLR是,Eclipse ...
您可能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已經使用導入的類,如:
,但我認爲最好的方法是用Abstract Syntax Tree作爲@Kong,
謝謝。但是,這對我在源代碼文件中查找所有方法調用的任務有何幫助? (我對其他信息不感興趣,只是調用哪些類的方法)。 –
勺子(作爲例子)將建立你的參考:http://spoon.gforge.inria.fr/references.html – Kong