2012-10-01 94 views
-1

我對Java反射不太好,我試圖調試使用大量反射的一段難看的代碼。我在應該調用的某些方法上放置了一個斷點,但是當我執行該程序時,代碼不會暫停。因此,這讓我相信,在Eclipse中運行時使用反射運行方法會忽略斷點(Windows 7上的Indigo)。是否可以調試Java反射?

任何人都可以證實這一點嗎?我在下面提供了一個例子,雖然由於我不知道如何執行一個特殊的方法使用反射,它不起作用,但我希望它澄清我在問我的問題:

public static void main(String[] args) 
{ 
    try 
    { 
     Class test = Class.forName("Test"); 

     test.runMethodDoSomething(); 
    } 
    catch (ClassNotFoundException e) 
    { 
     e.printStackTrace(); 
    } 
} 

public static class Test 
{ 
    public void doSomething() 
    { 
     // Place breakpoint here. 
    } 
} 
+0

我無法證實這一點!我曾深入反思過。調試一直工作。但你的代碼甚至不編譯! – home

+0

您可以使用體面的調試器調試任何Java代碼(我使用Eclipse和NetBeans IDE及其調試器)。也許問題在於你正在運行這個代碼(而不是調試)或者它根本沒有被調用。如果你想確定它,放置簡單的'System.out.println(「反射調用!」);'或類似的,以知道代碼已被執行。 –

+0

無法確認它,我已經完成了一個基於元數據的對象合併實用程序的核心,我使用純粹的反射和調試工作的應用程序保存了我的生活太多次。 – Gamb

回答

2

首先,反射與調試器不衝突。通常你可以在方法中放置斷點,然後使用反射調用它,調試器將停止在那裏。

其次,代碼片段中沒有反射。 Class.forName()是動態類加載。反思是當你使用obj.getClass().getMethod("myMethod").invoke()

因此,如果您的代碼段無效,請嘗試瞭解您的環境或可能在您的代碼中的問題。在調用方法之前有沒有機會引發某種異常,但是異常是在沒有通知的情況下捕獲的?

+0

是的,你最後的評論得到了它。例外情況不是打印堆棧跟蹤,這就是爲什麼代碼沒有執行。謝謝ALex – Sal

相關問題