2012-04-14 14 views
10

Come verificare se la classe data ha un campo specifico e se è inizializzata (ha un valore al momento)?Come verificare se una determinata classe ha un campo ed è stata inizializzata?

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

Ulteriori dettagli sarebbero davvero utili per rispondere. Esempio di codice forse? – Erwald

risposta

-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

effettivamente ['Class.getField()'] (http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getField%28java.lang.String%29) genererebbe a 'NoSuchFieldException' se il campo non è stato trovato (non restituirebbe null) e non è una buona idea affidarsi alle eccezioni per il controllo –

+2

La risposta non è valida, come menzionato da @ AhmadY.Saleh. getField() non restituisce il null, ma lancia l'eccezione. –

+1

Sì, getField o anche getDecalredField su cui non possiamo fare affidamento, poiché generano un'eccezione, non restituiscono un valore nullo. – Jagadeesh

6

È possibile utilizzare la riflessione, per esempio come questo:

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

E poi si può controllare di nuovo se particolare oggetto ha questo campo initialiazed utilizzando riflessione.

4

Non è necessario utilizzare il riflesso per questo, è possibile farlo semplicemente con condizione.

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 
      } 

È possibile controllare l'istanza non è nullo se l'istanza non è nullo e la sua un'istanza di mostro poi nel vostro caso la sua sicuramente inizializzato. Le variabili di istanza inizializzato con i valori di default ogni volta che una nuova istanza creata se l'istanza di un mostro avversario poi livello ha valore 1.

+0

è l'avversario (Monster)) .level = 1 o (Monster) avversario) .level == 1? – kamaci

+0

aggiornato .. grazie – Shehzad

4

per vedere se una classe ha una proprietà, senza fare affidamento su eccezioni, è possibile utilizzare questi metodi:

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

E semplicemente chiamano:

objectHasProperty(objInstance, "myPropertyName"); 

In realtà non importa l'istanza della classe per vedere se la classe ha la proprietà, ma ho fatto in questo modo, solo per essere poco più amichevole. Giusto per concludere: ho fatto le getAllFields per essere ricorsiva, per ottenere tutti i metodi di superclassi troppo (nel mio caso questo è importante)

Dopo di che, se si vuole vedere qual è il valore della proprietà nella desiderata oggetto, si può chiamare:

PropertyUtils.getProperty(objInstance, "myPropertyName"); 

Ricordate: se objInstance non ha quella proprietà, la chiamata sopra getterà NoSuchMethodException (Ecco perché è necessario utilizzare il codice pugno per vedere se la classe ha la proprietà)

+0

Il ciclo nella riga 17 può essere sostituito da 'Collections.addAll (fields, type.getDeclaredFields());' –

Problemi correlati