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

新手上路,请多包涵

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

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

原文由 J.Olufsen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 350
2 个回答
//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
 }
}

原文由 jmj 发布,翻译遵循 CC BY-SA 3.0 许可协议

要不依赖异常地查看类是否具有属性,可以使用这些方法:

 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 (这就是为什么你需要使用拳头代码来查看类是否具有该属性)

原文由 Renato Lochetti 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题