2013-04-20 59 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