2012-04-14 7 views
10

Wie überprüft man, ob die gegebene Klasse ein spezifisches Feld hat und ob sie initialisiert ist (hat im Moment einen Wert)?Wie überprüft man, ob eine bestimmte Klasse ein Feld hat und initialisiert wurde?

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

Und dann können Sie wieder überprüfen, ob bestimmte Objekt dieses Feld durch die Reflexion initialiazed hat:

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

Mehr Detail würde wirklich helfen, zu antworten. Codebeispiel vielleicht? – Erwald

Antwort

-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

tatsächlich ['Class.getField()'] (http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getField%28java.lang.String%29) würde werfen eine 'NoSuchFieldException', wenn das Feld nicht gefunden wurde (es würde keine Null zurückgeben) und es ist keine gute Idee, sich auf Ausnahmen zur Überprüfung zu verlassen –

+2

Die Antwort ist ungültig, wie @AhmadY.Saleh erwähnt hat. getField() gibt den Nullwert nicht zurück, sondern löst die Ausnahme aus. –

+1

Ja, getField oder sogar getDecalredField, auf die wir uns nicht verlassen können, da sie die Ausnahme auslösen und keinen Nullwert zurückgeben. – Jagadeesh

6

Sie können Reflexion, zum Beispiel wie folgt verwenden.

4

Sie müssen nicht Reflektion für diese verwenden, Sie können es einfach tun, wenn Bedingung.

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 
      } 

Sie können die Instanz überprüfen, ist nicht null, wenn beispielsweise nicht null und seine eine Instanz von Monster dann in Ihrem Fall sein definitiv initialisiert. Instanzvariablen mit Standardwerten initialisiert, wenn eine neue Instanz erstellt, wenn der Gegner Instanz eines Monster dann Pegelwert hat 1.

+0

ist es (Monster) Gegner) .level = 1 oder (Monster) Gegner) .level == 1? – kamaci

+0

aktualisiert .. danke – Shehzad

4

Um zu sehen, ob eine Klasse eine Eigenschaft hat, ohne Ausnahme zu verlassen, können Sie diese Methoden verwenden:

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; 
} 

Und rufen Sie einfach an:

objectHasProperty(objInstance, "myPropertyName"); 

In der Tat nicht die Instanz der Klasse ist egal, ob die Klasse die Eigenschaft hat, aber ich habe auf diese Weise, nur wenig freundlicher zu sein. Zum Schluss: Ich habe die getAllFields rekursiv, um alle Superklassen-Methoden zu bekommen (in meinem Fall ist das wichtig)

Danach, wenn Sie sehen wollen, was ist der Wert der Eigenschaft in der gewünschten Objekt, können Sie einfach anrufen:

PropertyUtils.getProperty(objInstance, "myPropertyName"); 

Denken Sie daran: wenn objInstance die diese Eigenschaft nicht hat, über den Anruf NoSuchMethodException werfen (das ist, warum Sie die Faust Code verwenden müssen, um zu sehen, ob die Klasse die Eigenschaft hat)

+0

Schleife in Zeile 17 kann ersetzt werden durch 'Collections.addAll (fields, type.getDeclaredFields());' –

Verwandte Themen