通过查找其类来获取对象属性

时间:2012-06-02 15:41:00

标签: java android

我在数组集合中有游戏对象,但它们可以是不同的类。我可以通过坐标找到对象:

Object obb = grid.getCellContent(insertObjectX, insertObjectY);

我需要做的是找到obb.canBeSubmerged == true然后简单地将其移动到另一个数组。

问题是我可以获得该对象的属性“canBeSubmerged”,因为编译器不知道我使用了哪个类。

我想知道是否有更快的方法可以对每个可能的对象类进行"obb.getClass() == myClass.class"语句。

编辑:基于无能为力建议,这是一个有效的解决方案:

try {    
   java.lang.reflect.Field f1 = obb.getClass().getField("canBeSubmerged");
   java.lang.reflect.Field f2 = obb.getClass().getField("subObject"); 
   if (f1 != null) {       
      canBeSubmerged = f1.getBoolean(obb); 
      f2.setBoolean(obb, canBeSubmerged);
   } 
}catch (Exception e) { } 


//enter it into the submerged grid level and remove from the top grid level
if (canBeSubmerged){
    grid.removeObject(insertObjectX, insertObjectY);
    grid.putSubObjectInCell(insertObjectX, insertObjectY, obb);
}

3 个答案:

答案 0 :(得分:1)

如果包含obb属性的canBeSubmerged对象始终属于特定的类类型,例如MyOBB.class,则可以执行此操作...

if (obb instanceof MyOBB.class) {
    if (((MyOBB)obb).canBeSubmerged) {
       // do your work
    }
}

========= OR ============

使用反射(速度较慢)

try {
   Field f = obb.getClass().getField("canBeSubmerged");
   if (f!=null && f.getBoolean(obb)) {
      // do your work
   }
} catch (Exception e) {
}

答案 1 :(得分:1)

您的对象可能应该扩展一个公共超类或实现一个定义方法的公共接口

public boolean canBeSubmerged();

您不应使用公共字段。还要注意

if (obb.canBeSubmerged() == true)

可以写成

if (obb.canBeSubmerged())

更符合逻辑和可读性。

答案 2 :(得分:1)

如果您只对对象的一个​​属性感兴趣,可以将其提取到界面
public interface Submergable {
      boolean isSubmerged();
    }

让所有可能潜入的对象实现它。

然后你可以Object instanceof Submergable