2012-03-07 249 views
-2

在同一個包中有two classes A and B獲取類名稱函數的名稱

如何獲得由B類稱爲

限制類A的功能名稱是A和B的代碼不能被修改

+4

目前還不清楚問題是什麼,請更新您的問題,以使您試圖做得更清楚。也請張貼你已經嘗試過的代碼。 – 2012-03-07 04:51:40

+0

你想在運行時執行此操作嗎?通過靜態分析?到目前爲止,你已經發布的這個標準並不是真正的問題。 – 2012-03-07 05:02:05

+0

@JimGarrison我想通過靜態分析來做到這一點。 – Saurabh 2012-03-07 05:07:54

回答

1

反射可以是非常有用的,但如果你不明白它會非常複雜。

如果你有類的名稱,並且要打印的方法:

Class c = Class.forName(the_class_name); 

for(Method m : c.getMethods()) { 
    System.out.println(m.toString()); 
} 

如果你想獲得任何對象的類的名稱:

String className = the_object.getClass().getName(); 

的組合兩個可能看起來像這樣:

for(Method m : the_object.getClass().getMethods()) 
    System.out.println(m.toString()); 

我想你所要求的是所有方法的名稱從AB調用。

這不能真正做到反思,主要是因爲Java沒有提供任何方法來做到這一點。

The API一如既往提供更多信息。如果你通過那裏看,你可能會想出一個簡單的解決方法。

1

「A級或B級調用的所有函數的類」令人困惑。但是,如果您想將調用方的類和函數名稱設置爲A中描述的方法detectsName,那麼下面的代碼將對您有用。

public class A { 
    public void detectsName() { 
     Throwable t = new Throwable(); 
     StackTraceElement traceLine = t.getStackTrace()[1]; 
     // t.printStackTrace(); 
     String className = traceLine.getClassName(); 
     String methodName = traceLine.getMethodName(); 
     int lineNumber = traceLine.getLineNumber(); 
     System.out.println(className); 
     System.out.println(methodName); 
     System.out.println(lineNumber); 
    } 
} 

如果您從任何其他類這種方法說 - B,它會被檢測到。

public class B { 
    public static void main(String[] args) { 
     A a = new A(); 
     a.detectsName(); 
    } 
} 
3

您不能使用Java反射來執行這樣的靜態代碼分析任務。反射API不提供所需的信息。

關閉我的頭頂,我能想到的,將工作兩種方法:

  • 如果只有「.class」的文件,那麼你可以使用一個字節碼的庫,例如BCEL到加載類並遍歷它們以識別所有的方法調用。

  • 如果您有源代碼,您還可以使用一些現有的Java分析器庫爲您的代碼創建AST並分析它們。

(第一種方法可能是簡單的,如果你想要的是類和方法名的列表。)

0

Dependency Finder這個可以做查詢。它的方法是用XML生成元數據,然後使用基於正則表達式的比較。您可能正在專門尋找名爲「封閉」的功能,並帶有入站引用。