如何检查给定的类是否有字段并且已初始化?

2022-09-04 02:28:54

如何检查给定的类是否具有特定字段以及它是否已初始化(此刻具有值)?

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

答案 1

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

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");

请记住:如果没有该属性,上面的调用将引发(这就是为什么您需要使用first代码来查看该类是否具有该属性)objInstanceNoSuchMethodException


答案 2

您可以使用反射,例如:

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

然后,您可以再次检查特定对象是否通过使用反射初始化此字段。