Groovy - 如何反映来自另一个groovy应用程序的代码以查找其中的类/属性/类型

时间:2016-09-01 21:19:54

标签: grails reflection groovy grails-2.0

首先,我来自.NET背景,所以请原谅我缺乏常规术语。当我在.NET商店时,我们使用TypeScript和C#来构建Web应用程序。在我们的控制器中,我们总是接收/响应DTO(数据xfer对象)。每次创建/修改DTO时都需要更新与之对应的TypeScript接口(d.ts文件),这一点非常令人头疼。

所以我们创建了一个小应用程序(一个简单的exe),它将来自webapp的dll加载到其中,然后反映在它上面以找到DTO(通过特定名称空间过滤),并通过它们解析以查找其中的每个类名,他们的财产,他们的财产'数据类型,将该信息生成为字符串,最后保存为d.ts文件。

然后将此应用程序配置为在网站的每个版本上运行。这样,当您去运行/调试/构建网站时,它会自动更新您的d.ts文件 - 这使得使用TypeScript变得更加容易。

长话短说,如果我要编写一个简单的常规应用来生成我想要的d.ts,我怎么能用Grails网站实现这个目标?

- 或 -

如何让IDE(例如IntelliJ)运行一个groovy文件(该应用程序的一部分),在构建后执行这一代?

我确实找到了这个,但仍需要一种在编译时运行的方法:

  

Groovy property iteration

class Foo {
    def feck = "fe"
    def arse = "ar"
    def drink = "dr"    
}

class Foo2 {

    def feck = "fe2"
    def arse = "ar2"
    def drink = "dr2"
}


def f = new Foo()
def f2 = new Foo2()


f2.properties.each { prop, val ->
    if(prop in ["metaClass","class"]) return
    if(f.hasProperty(prop)) f[prop] = val
}

assert f.feck == "fe2"
assert f.arse == "ar2"
assert f.drink == "dr2"

2 个答案:

答案 0 :(得分:1)

我已经能够通过以下Gant脚本提取域对象及其持久性字段:

scripts / Props.groovy 中:

grails props

这可以通过命令行运行,如下所示:

{
    "com.mycompany.User": [
        { "type": "java.lang.String" },
        { "username": "java.lang.String" },
        { "password": "java.lang.String" }
    ],
    "com.mycompany.Person": [
        { "name": "java.lang.String" },
        { "alive": "java.lang.Boolean" }
    ]
}

产生如下输出:

{{1}}

这种方法的一些缺点是我们没有获得任何瞬态属性,而且我不确定如何将其挂钩到_Events.groovy eventCompileEnd事件中。

答案 1 :(得分:0)

谢谢凯文!只是想提一下,为了让它能够运行,这里有一些我必须确保做的事情,我认为我会分享:

- >打开grails BuildConfig.groovy

- >将tomcat从build更改为如下编译:

plugins {
    compile ":tomcat:[version]"
}

- >将Props.groovy删除到根目录下的scripts文件夹中(注意grails-app文件夹的路径以供参考)

[application root]/scripts/Props.groovy
[application root]/grails-app

- >打开终端

gvm use grails [version]
grails compile
grails Props

注意:我正在使用Grails 2.3.11来运行我正在运行的项目。

这使得脚本中的所有内容都能成功运行。现在修改println部分以生成Typescript接口。

准备好后会发布github链接,所以请务必回来查看。