Groovy : Class.forName().newInstance() 错误
Groovy : Class.forName().newInstance() error
我有以下方法,其中我 return 使用 List<GPathResult> filteredList
的 List<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, '', '')
最后一个例子对我来说没有任何异常。
希望对您有所帮助。
我有以下方法,其中我 return 使用 List<GPathResult> filteredList
的 List<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, '', '')
最后一个例子对我来说没有任何异常。
希望对您有所帮助。