2012-04-14 60 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

相關問題