2013-04-20 73 views
-1

我正在構建一個俄羅斯方塊遊戲。我目前正在調試遊戲,爲了做到這一點,我需要查看所有變量和變量變量等的值。有了反思,我可以通過這樣做得到所有班級字段:獲取所有字段值java程序

try 
{ 
    for(Field field : this.getClass().getDeclaredFields()) 
    { 
     field.setAccessible(true); 
     System.out.println(field.get(this)); 
    } 
} 
catch(Exception e) 
{ 
} 

我不知道如何獲取每個字段對象的所有字段值。

+4

對於調試,使用一個調試器,它可以讓你通過鱈魚e逐行顯示並遞歸查看所有變量和對象。 System.out.println是窮人的調試器。 – 2013-04-20 21:27:06

+1

我想這可能會工作,但我需要所有的字段值,以便我可以在屏幕上顯示崩潰報告 – 2013-04-20 21:28:43

+0

如果您正在運行服務並希望能夠在生產中記錄狀態,請不要這樣做。 – SirPentor 2013-04-20 21:28:54

回答

2

有你需要做兩件事情:

  1. 創建一組可到達的對象。你不想遞歸地遍歷你的對象圖。
  2. 打印每個對象的值。

對於第一個,你需要使用像IdentityHashMap

import java.util.IdentityHashMap; 

class MyObjectCache 
{ 
    final IdentityHashSet objects = new IdentityHashSet(); 
    ... 
} 

要穿越的對象,你可以使用遞歸功能(這是簡單的,但有一個堆疊限制):

class MyObjectCache 
{ 
    .... 
    void registerObject(Object o) 
    { 
     if (objects.contains(o)) 
     { 
      return; 
     } 

     objects.add(o); 
     for(Field field : o.getClass().getDeclaredFields()) 
     { 
      field.setAccessible(true); 
      registerObject(field.get(o)); 
     } 
    } 
    ... 
} 

然後你就可以開始打印收集到的對象了......

+1

IdentityHashSet更合適。另外,getDeclaredFields()不包含繼承的字段。 +1雖然。 – 2013-04-20 21:42:54

+0

@JBNizet謝謝。我的壞 – 2013-04-20 21:48:24

+0

感謝您的建議,我應該能夠做到這一點我自己 – 2013-04-20 21:49:38