2012-04-14 63 views
10

如何检查给定的类是否有特定的字段,以及是否已初始化(此时有值)?如何检查给定的类是否有字段并且已初始化?

abstract class Player extends GameCahracter { 

} 

public class Monster extends GameCahracter{ 

    public int level = 1; 
} 
abstract class GameCharacter{ 

    public void attack(GameCahracter opponent){ 

     if (opponent instanceof Monster &&){ // << here I have to know is it instance of Monster and if it has initialized value 
      } 
} 
+0

更多细节真的有助于回答。代码示例也许? – Erwald 2012-04-14 19:26:07

回答

-1
//Load the class 

Class clazz = Class.forName("your.class.ClassName"); 
Field field = clazz.getField("fieldName") 
if(field!=null){ 
//field exist now check if its initialized or not, or if its primitive field check against its assumed initialized value 
if(ClassName.fieldName!=null){ 
    //yes initilized 
} 
} 
+13

其实['Class.getField()'](http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getField%28java.lang.String%29)会抛出如果未找到该字段(它不会返回null),则返回一个'NoSuchFieldException',并且依赖异常进行检查并不是一个好主意 – 2012-11-28 14:39:12

+2

答案是无效的,正如@AhmadY.Saleh所提到的。 getField()不返回null,但引发异常。 – 2014-10-17 10:25:11

+1

是的,getField甚至getDecalredField都是我们不能依赖的,因为它们抛出异常,不返回空值。 – Jagadeesh 2016-04-15 14:04:38

6

您可以使用反射,例如像这样:

Class.forName("Foo").getFields() 

然后你就可以当特定对象具有该领域使用反射initialiazed再次检查。

4

你不必为此使用反射,你可以简单地使用if条件。

if (opponent !=null && opponent instanceof Monster && ((Monster) opponent).level==1){ // << here I have to know is it instance of Monster and if it has initialized value 
      } 

您可以检查实例不为空,如果示例中未空,它的再怪物的情况下,你的情况肯定其初始化。实例变量初始化每当一个新的实例创建的默认值,如果一个怪物的对手实例,然后水平具有价值1

+0

是(怪物)对手).level = 1还是(怪物)对手).level == 1? – kamaci 2015-03-04 13:14:43

+0

已更新..谢谢 – Shehzad 2015-03-05 14:16:41

4

要查看是否有类具有不依赖于异常的属性,可以使用以下方法:

private Boolean objectHasProperty(Object obj, String propertyName){ 
    List<Field> properties = getAllFields(obj); 
    for(Field field : properties){ 
     if(field.getName().equalsIgnoreCase(propertyName)){ 
      return true; 
     } 
    } 
    return false; 
} 

private static List<Field> getAllFields(Object obj){ 
    List<Field> fields = new ArrayList<Field>(); 
    getAllFieldsRecursive(fields, obj.getClass()); 
    return fields; 
} 

private static List<Field> getAllFieldsRecursive(List<Field> fields, Class<?> type) { 
    for (Field field: type.getDeclaredFields()) { 
     fields.add(field); 
    } 

    if (type.getSuperclass() != null) { 
     fields = getAllFieldsRecursive(fields, type.getSuperclass()); 
    } 

    return fields; 
} 

而且只需拨打:

objectHasProperty(objInstance, "myPropertyName"); 

其实没关系的类的实例,看看如果该类财产,但我做了方式,只是要多一点友好。 就得出结论:我做了getAllFields是递归的,让所有的超类方法过于(对我来说这很重要)

之后,如果你想看到什么是财产的价值在所需对象,你可以致电:

PropertyUtils.getProperty(objInstance, "myPropertyName"); 

记住:如果objInstance没有该属性,调用上面会抛出NoSuchMethodException(这就是为什么你需要使用拳头代码,看看如果类的属性)

+0

第17行中的循环可以替换为'Collections.addAll(fields,type.getDeclaredFields());' – 2017-01-26 06:26:25

相关问题