当前位置: 代码迷 >> java >> 获取Java / Groovy中Class属性的类型
  详细解决方案

获取Java / Groovy中Class属性的类型

热度:94   发布时间:2023-07-18 08:53:00.0

我正在Grails上创建动态查询。 用户界面将传递一个包含所有条件的JSON对象。 我设法做到这一点:

def criteria = params.criteria

def l = DomainClass.createCriteria().list {
    for(int k = 0; k < criteria.names().length(); k++) {
        def names = list[x].names()
        if(DomainClass.hasProperty(names[k])) {
            eq(names[k], list[x][names[k]])
        }
    }
}

如果DomainClass所有属性都是String类型,这已经可以工作了,但是我还使用了LongDate类的其他类型,因此我想实现以下内容:

def criteria = params.criteria

def l = DomainClass.createCriteria().list {
    for(int k = 0; k < criteria.names().length(); k++) {
        def names = list[x].names()
        if(DomainClass.hasProperty(names[k])) {
            if(/* DomainClass.getProperty(names[k]).getClass() == Long */) {
                // Parse first string to long before actually using it to the criteria
                eq(names[k], Long.valueOf(list[x][names[k]]).longValue()))
            }
            else if(/* DomainClass.getProperty(names[k]).getClass() == Date */) {
                // parse first date
                ...
            }
            else {
                // The default criteria
                eq(names[k], list[x][names[k]])
            }
        }
    }
}

但是我不知道在Java中还是在Groovy中对if语句中的条件使用什么。

有几种方法可以解决这个问题

instanceof

要么

object.getClass().equals(Float.class);

用你的例子,你可以做类似的事情

if(DomainClass.getProperty(names[k]).getClass().equals(Date.class))

完全符合

new Long(1L).getClass().equals(Long.class)
> true

要么

new Long(1L) instanceof Number
> true
new Long(1L) instanceof Long
> true

您的==方法(添加了.class )也应该起作用,因为不太可能加载两个不同的Long类,但我更喜欢equals方法。

new Long(1L).getClass() == Long.class
> true (most likely)
  相关解决方案