有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

groovy如何动态创建Java类列表?

我使用的是groovy 1.8,我希望有一个类似这样的列表
List<MyQueryClass> queryl=new List<MyQueryClass>()
因此,使用下面的循环,我可以添加更多到这个列表中,我如何才能做到这一点

def queryxml=new XmlSlurper().parse(QueryProvider.class.getResourceAsStream( '/queries.xml' ))
    queryxml.query.each { node ->
        operation="${node.@operation.text()}"
        if(operation.equals(op.create.toString()))
        {
            query="${node.text()}"
            println "$query"
            MyQueryClass myQuery=new MyQueryClass (query)
            queryl.add(myQuery)
        }           
    }

共 (2) 个答案

  1. # 1 楼答案

    你没有给我们太多的机会,但假设你有一门课:

    @groovy.transform.Canonical class MyQuery {
      String queryText
    }
    

    您的XML类似于:

    def xml = '''<xml>
      <query operation="create">
        This is q1
      </query>
      <query operation="q2">
        This is q2
      </query>
      <query operation="create">
        This is q3
      </query>
    </xml>'''
    

    然后,您应该能够使用findAll将xml限制为仅关注的节点,然后使用collect构建对象列表,如下所示:

    def queryxml = new XmlSlurper().parseText( xml )
    
    List<MyQuery> query = queryxml.query.findAll { node ->  // Filter the nodes
      node.@operation.text() == 'create'
    }.collect { node ->                                     // For each matching node, create a class
      new MyQuery( node.text().trim() )
    }
    
    println query
    

    然后打印出:

    [MyQuery(This is q1), MyQuery(This is q3)]
    

    PS:The groovy.transform.Canonical注释is explained here

  2. # 2 楼答案

    很抱歉,我无法恰当地表达我的问题
    我明白了,因为我不能用抽象的java接口创建实例。util。名单

    List<MyQueryClass> queryl=new ArrayList<MyQueryClass>() 
    

    他做这项工作。谢谢tim和draganstankovic