在Grails里,通过定义DomainClass来对业务对象建模,那么在进行代码生成的时候,是如何获得这些模型的呢?
本文做一些初步的探讨。
下面定义一个类:
class A{
static def attr1 = "bar"
def attr2 = "foo"
}
通过脚本,如何能获得attr1, attr2的值呢。
最简单的方法:
def a = new A();
println a.attr1
println a.attr2
如果不能实例化呢,可以通过Class获取静态变量值
println A.attr1
println A.metaClass.getJavaClass().attr1
println a.class.attr1
如果需要通过动态属性名获取静态变量值的情形呢,用下面的方法
def propName = "attr1"
println A."$propName"
println A.metaClass.getJavaClass()."$propName"
println a.class."$propName"
如果连类都需要动态获得呢,用下面的方法可以
注意这部分需要把类定义文件命名为A.groovy,并通过groovc编译
def clsName = "A"
def propName = "attr1"
def cls = Class.forName(clsName)
println cls.attr1
println cls."$propName"
println cls.metaClass.getJavaClass()."$propName"
def a2 = cls.newInstance()
println a2.attr2
2008-12-30 ,继续补充一下:
对于属性和方法的访问,Groovy提供的标准接口是MetaObjectProtocol 。
对于本例子,只要能够获得MetaClass,即可通过getAttribute来方便地获取属性值,包括静态和动态的属性。
//获得静态属性值
cls.metaClass.getAttribute(null,'attr1')
//获得非静态属性值
cls.metaClass.getAttribute(a2,'attr2')