我正在使用反射从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可用于检查原始数据类型及其默认值?
答案 0 :(得分:2)
我所做的是始终使用字段的兼容类型,避免使用原语。
所以,对于布尔值,我会在基本类型boolean上使用Boolean类型,对于整数,我会使用Integer over int类型。
假设你有:
class Person {
int age;
}
您可以使用:
class Person {
Integer age;
}
然后你可以测试(年龄!= null)。
希望这有帮助。
答案 1 :(得分:2)
它不会失败。它将正常工作 - 字段值永远不会是null
,因此该字段将包含在标准中。 income=0
与income=10000
一样有效。如果您希望默认值表示“无值”,则可以使用包装类型(Integer
)。另一个特殊值可能是Integer.MIN_VALUE
。显然,这对布尔人不起作用。
答案 2 :(得分:2)
您可以使用以下方法检查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
答案 3 :(得分:0)
用于确定类型是否不是对象而是基元可以使用getClass()。isPrimitive()
http://download.oracle.com/javase/1,5,0/docs/api/java/lang/Class.html#isPrimitive%28%29