Groovy : Class.forName().newInstance() 错误

Groovy : Class.forName().newInstance() error

我有以下方法,其中我 return 使用 List<GPathResult> filteredListList<ImField> 对象。我在生成的地方执行 filteredList.each 关闭 class 在运行时并为其分配静态类型 ImField.

static List<ImField> getFields(GPathResult root,String fieldClass, String fieldType){
        List<GPathResult> filteredList = root.children().findAll{
            XMLSlurperUtil.name(it as GPathResult) == fieldType
        } as List<GPathResult>
        List<ImField> fields = []
        filteredList.each{GPathResult it,  int index ->
            fields.add(Class.forName(fieldClass).newInstance() as ImField)
            fields[index].set(it)
        }
        fields
}

函数调用如下所示:

ImStageUtil.getFields(root, ImFieldFactory.SOURCE_FIELD, ImParserConstants.SOURCE_FIELD)

其中 ImFieldFactory.SOURCE_FIELD = "com.dto.fields.SourceField"ImParserContants.SOURCE_FIELD = "SOURCEFIELD"

错误发生在.each关闭行:

No signature of method: com.extractor.ImStageUtil$_getFields_closure11.doCall() is applicable for argument types: (groovy.util.slurpersupport.NodeChild) values: []
Possible solutions: doCall(groovy.util.slurpersupport.GPathResult, int), findAll(), findAll(), isCase(java.lang.Object), isCase(java.lang.Object)
groovy.lang.MissingMethodException: No signature of method: com.extractor.ImStageUtil$_getFields_closure11.doCall() is applicable for argument types: (groovy.util.slurpersupport.NodeChild) values: []
Possible solutions: doCall(groovy.util.slurpersupport.GPathResult, int), findAll(), findAll(), isCase(java.lang.Object), isCase(java.lang.Object)

我已经尝试创建一个与您的示例类似的脚本,我必须修改两件事(如果您的 filteredList 不为空,您需要先检查一下):

1- 您需要在 findAll{} 关闭后使用 collect(),这允许您收集所有条目并将它们添加到您的 filteredList.

2- 你正在使用 .each{} 并且你提供了一个 List 和索引,这应该被替换为 .eachWithIndex{} 因为第一个不期望一个索引。 这是您的代码的简化版本:

import groovy.util.slurpersupport.GPathResult

def text = '''
    <list>
        <technology>
            <name>Groovy</name>
        </technology>
    </list>
'''

def list = new XmlSlurper().parseText(text)

def List getFields(GPathResult root,String fieldClass, String fieldType){
        List<GPathResult> filteredList = root.children().findAll{
            //println(it)
            it != null
        }.collect() as List<GPathResult>

        println('list: ' + filteredList.getClass() + ', ' + filteredList.size())

        filteredList.eachWithIndex{GPathResult it,  int index ->
            println('it: ' + it)
        }
}

getFields(list, '', '')

最后一个例子对我来说没有任何异常。

希望对您有所帮助。