2012-04-14 16 views
10

¿Cómo comprobar si la clase dada tiene un campo específico y si está inicializada (tiene valor en este momento)?¿Cómo comprobar si una clase determinada tiene un campo y se inicializó?

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

Más detalles realmente ayudaría a responder. Ejemplo de código tal vez? – Erwald

Respuesta

-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

en realidad ['Class.getField()'] (http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getField%28java.lang.String%29) arrojaría una 'NoSuchFieldException' si el campo no se encontró (no devolvería nulo) y no es una buena idea confiar en las excepciones para verificar –

+2

La respuesta no es válida, como ha mencionado @ AhmadY.Saleh. getField() no devuelve el valor nulo, pero arroja la excepción. –

+1

Sí, getField o incluso getDecalredField no podemos confiar en ambos, ya que arrojan una excepción, no devuelven el valor nulo. – Jagadeesh

6

Puede utilizar la reflexión, por ejemplo como este:

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

Y entonces se puede comprobar de nuevo si determinado objeto tiene este campo initialiazed mediante el uso de la reflexión.

4

No tiene que usar reflejo para esto, simplemente puede hacerlo con la condición 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 
      } 

Puede comprobar la instancia no es nulo si la instancia no es nulo y es un ejemplo de Monster continuación, en su caso, su definitivamente inicializado. Las variables de instancia inicializado con valores por defecto cada vez que una nueva instancia creada si la instancia de un monstruo oponente continuación nivel tiene valor 1.

+0

¿es (Monstruo) oponente) .level = 1 o (Monstruo) oponente) .level == 1? – kamaci

+0

actualizado ... gracias – Shehzad

4

Para ver si una clase tiene una propiedad sin depender de excepción, puede utilizar estos métodos:

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

y simplemente llaman:

objectHasProperty(objInstance, "myPropertyName"); 

de hecho no importa la instancia de la clase para ver si la clase tiene la propiedad, pero lo hizo de esa manera, sólo para estar poco más amable. Solo para concluir: hice que getAllFields sea recursivo, para obtener todos los métodos de superclases también (en mi caso esto es importante)

Después de eso, si quiere ver cuál es el valor de la propiedad en el deseado objeto, sólo puede llamar a:

PropertyUtils.getProperty(objInstance, "myPropertyName"); 

Recuerde: si objInstance no tiene esa propiedad, la llamada anterior tirará NoSuchMethodException (Por eso es necesario utilizar el código puño para ver si la clase tiene la propiedad)

+0

Loop en la línea 17 se puede reemplazar por 'Collections.addAll (fields, type.getDeclaredFields());' –

Cuestiones relacionadas