Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dynamic 使用带Mixin注释的asType_Dynamic_Groovy_Metaprogramming_Categories_Mixins - Fatal编程技术网

Dynamic 使用带Mixin注释的asType

Dynamic 使用带Mixin注释的asType,dynamic,groovy,metaprogramming,categories,mixins,Dynamic,Groovy,Metaprogramming,Categories,Mixins,我想用Groovy编写一个自定义类型转换。目标是将映射的值分配给groovybean的字段。将来会有不同的响应类型。映射的值始终为String类型,但必须转换为其他数据类型。为了实现这一点,我创建了一个Category类,它实现了一个名为asType的方法。这是我的代码的一个简化示例: class MapCategory { static Object asType(Map self, Class clazz) { if(clazz == Response) {

我想用Groovy编写一个自定义类型转换。目标是将映射的值分配给groovybean的字段。将来会有不同的响应类型。映射的值始终为String类型,但必须转换为其他数据类型。为了实现这一点,我创建了一个Category类,它实现了一个名为asType的方法。这是我的代码的一个简化示例:

class MapCategory {
    static Object asType(Map self, Class clazz) {
        if(clazz == Response) {
            Response response = new Response()

            self.each { key, value ->
                response.setProperty(key, value)
            }

            return response
        }

        DefaultGroovyMethods.asType(self, clazz)
    }
}

class Response {
    String result
    String message
}
当我使用use关键字应用类别时,这种方法非常有效

然而,当我尝试使用@Mixin注释时,它似乎无法正常工作。我得到了正确的响应类型,但所有字段都为空


有人知道为什么使用注释时它不能正常工作吗?

mixin不能这样工作。您正试图将Map的方法混合到MyClass对象中。只有在MyClass扩展映射时,mixin才会工作

相反,您希望像普通一样使用use关键字,并将您的类别作为一个类别使用

或者,您可能根本不需要它。您知道吗,默认情况下,您可以将任何映射转换为任何GroovyBean,而无需额外的代码?只需使用基于映射的构造函数,如下所示:

@groovy.transform.Canonical // Groovy 1.8, just added for automatic toString method
class Response {
    String result
    String message
}

println new Response([result: 'OK', message: 'Success'])
println([result: 'bad', message: 'blah'] as Response)
注意,自动地图转换是双向的。这是Groovy的一个内置特性

当然,如果您需要比仅仅分配bean属性更复杂的东西,这是没有帮助的

注意:我会给你一个链接,但是Groovy网站似乎已经坏了,我找不到代码示例-

编辑:另一个建议

与其使用类别,不如让bean自己来处理它:

@groovy.transform.Canonical
class Response {
    String result
    String message
    int num

    public void setNum(String num) {
       this.num = Integer.parseInt(num) 
    }
}

def map = [result: 'OK', message: 'Success', num: '35' ]

println map as Response

我知道如何将地图传递给Groovy Bean。我的示例代码被简化了。实际的bean还有其他数据类型,如整数和布尔值。但是,我的地图只在开头包含字符串。在我的分类中,我会将其转换为正确的数据类型。好吧,就像我在顶部所说的,然后使用。或者,我用另一个建议更新了它。哎呀,忘了这个。在作业前。第二个例子现在应该可以了。我想我只需要手动设置字段,而不是使用类别。
@groovy.transform.Canonical // Groovy 1.8, just added for automatic toString method
class Response {
    String result
    String message
}

println new Response([result: 'OK', message: 'Success'])
println([result: 'bad', message: 'blah'] as Response)
@groovy.transform.Canonical
class Response {
    String result
    String message
    int num

    public void setNum(String num) {
       this.num = Integer.parseInt(num) 
    }
}

def map = [result: 'OK', message: 'Success', num: '35' ]

println map as Response