繁体   English   中英

java原始数据类型

[英]java primitive data type

我正在使用反射从Java对象创建条件查询。 功能如下

     private void createCriteria(Class searchClass, Object object, Criteria criteria, Field field, ClassMetadata classMetadata)
        throws Exception, DAOSystemException
      {
        String fieldName = field.getName();

        Object fieldValue = invokeGetterMethod(object.getClass(), getRoleNameForMethodInvocation(field.getName()), object);

        if (fieldValue != null)
        {
          Class fieldTypeClass = field.getType();
          addCriteria(criteria, fieldName, fieldValue, fieldTypeClass, classMetadata);
        }
      }

当“字段”是原始数据类型时,我遇到了问题。 在这种情况下,以下检查将失败。

        if (fieldValue != null)

有没有可用的API检查原始数据类型及其默认值?

我要做的是始终对字段使用兼容类型,并避免使用基元。

因此,对于布尔值,我将在原始类型布尔值上使用布尔类型,对于整数,将对整数使用类型Integer。

假设您有:

class Person {
    int age;
}

您可以使用:

class Person {
    Integer age;
}

然后,您可以测试(年龄!= null)。

希望这可以帮助。

它不会失败。 它将正常工作-字段值永远不会为null ,因此该字段将包含在条件中。 并且income=0income=10000一样有效。 如果希望默认值表示“无值”,则可以使用包装器类型( Integer )。 另一个特殊值可能是Integer.MIN_VALUE 显然,这不适用于布尔值。

您可以使用以下方法检查Object的属性是否为null或具有默认值:

public static boolean isNullOrDefaultValue(Field field, Object obj) throws Exception {
    boolean result = false;
    if(!field.getType().isPrimitive()) {
        if (field.get(obj) == null) {
            result = true;
        }
    } 
    else{
        Class objClass =  field.getType();
        if (int.class.equals(objClass) ||  long.class.equals(objClass) ||
                short.class.equals(objClass) || byte.class.equals(objClass)) {
            if (field.getLong(obj) == 0) {
                result = true;
            }
        } else if(float.class.equals(objClass) || double.class.equals(objClass)) {
            if (field.getDouble(obj) == 0.0D) {
                result = true;
            }
        } else if(boolean.class.equals(objClass)) {
            if (field.getBoolean(obj) == false) {
                result = true;
            }
        } else if (char.class.equals(objClass)) {
            if (field.getChar(obj) == '\u0000') {
                result = true;
            }
        }
    }
    return result;
}

这是一个示例用法。 如果我们有以下课程:

class ClassA {
    public int intValue;
    public short shortValue;
    public byte byteValue;
    public long longValue;
    public float floatValue;
    public double doubleValue;
    public char charValue;
    public boolean booleanValue;
    public String stringValue;
}

因此,我们可以使用以下主要方法进行测试:

public static void main(String[] args) throws Exception {
    Class aClass = ClassA.class;
    Object aInst = new ClassA();
    Field[] fields = aClass.getFields();
    for (int i = 0; i < fields.length; i++) {
        Field field = fields[i];
        System.out.println("Name: " + field.getName() + " Eval:" + isNullOrDefaultValue(field, aInst));
    }
}

结果将是:

Name: intValue Eval:true
Name: shortValue Eval:true
Name: byteValue Eval:true
Name: longValue Eval:true
Name: floatValue Eval:true
Name: doubleValue Eval:true
Name: charValue Eval:true
Name: booleanValue Eval:true
Name: stringValue Eval:true

用于确定类型是否不是对象而是原始对象,可以使用getClass()。isPrimitive()

http://download.oracle.com/javase/1,5,0/docs/api/java/lang/Class.html#isPrimitive%28%29

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM