примитивный тип данных Java - PullRequest
       3

примитивный тип данных Java

1 голос
/ 04 октября 2011

Я создаю запрос критерия из 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);
        }
      }

У меня проблема, когда «field» - это примитивный тип данных.В этом случае следующая проверка не будет выполнена.

        if (fieldValue != null)

Существует ли какой-либо API для проверки типа данных примитива и его значения по умолчанию?

Ответы [ 4 ]

2 голосов
/ 15 октября 2011

Вы можете использовать следующий метод для проверки, является ли атрибут объекта нулевым или имеет значение по умолчанию:

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
2 голосов
/ 04 октября 2011

Это не подведет.Он будет работать правильно - значение поля никогда не будет null, поэтому поле будет включено в критерии.И income=0 является действительным как income=10000.Если вы хотите, чтобы значения по умолчанию означали «нет значения», то вы можете использовать типы-оболочки (Integer).Другое специальное значение может быть Integer.MIN_VALUE.Это, очевидно, не работает для логических значений.

2 голосов
/ 04 октября 2011

Я всегда использую совместимый тип для поля и избегаю использования примитивов.

Итак, для логических выражений я бы использовал тип Boolean вместо базового типа boolean, для целых чисел я бы использовал тип Integer вместо int.

Предположим, у вас есть:

class Person {
    int age;
}

Вы можете использовать:

class Person {
    Integer age;
}

Затем вы можете проверить (age! = Null).

Надеюсь, это поможет.

0 голосов
/ 04 октября 2011

для определения, является ли тип не объектом, а примитивом, вы можете использовать getClass (). IsPrimitive ()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...