当前位置:K88软件开发文章中心编程语言JavaGroovy → 文章内容

Groovy 元对象编程

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-15 15:50:06

由 lichiabor 创建,小路依依 最后一次修改 2016-12-12 元对象编程或MOP可以用于动态调用方法,并且可以即时创建类和方法。那么这是什么意思呢?让我们考虑一个叫Student的类,它是一个没有成员变量或方法的空类。假设你必须在这个类上调用以下语句。Def myStudent = new Student() myStudent.Name = ”Joe”; myStudent.Display()现在在元对象编程中,即使类没有成员变量Name或方法Display(),上面的代码仍然可以工作。这如何工作?那么,为了这个工作,一个人必须实现GroovyInterceptable接口挂钩到Groovy的执行过程。以下是该接口的可用方法。Public interface GroovyInterceptable { Public object invokeMethod(String methodName, Object args) Public object getproperty(String propertyName) Public object setProperty(String propertyName, Object newValue) Public MetaClass getMetaClass() Public void setMetaClass(MetaClass metaClass) }所以在上面的接口描述中,假设你必须实现invokeMethod(),它会被调用的每个方法,要么存在或不存在。缺失属性所以,让我们看一个例子,我们如何为缺失的属性实现元对象编程。以下键应该注意以下代码。类Student没有定义名为Name或ID的成员变量。类Student实现GroovyInterceptable接口。有一个称为dynamicProps的参数,将用于保存即时创建的成员变量的值。方法getproperty和setproperty已被实现以在运行时获取和设置类的属性的值。class Example { static void main(String[] args) { Student mst = new Student(); mst.Name = "Joe"; mst.ID = 1; println(mst.Name); println(mst.ID); }}class Student implements GroovyInterceptable { protected dynamicProps=[:] void setProperty(String pName,val) { dynamicProps[pName] = val } def getProperty(String pName) { dynamicProps[pName] } } 以下代码的输出将是 - Joe 1缺失方法所以,让我们看一个例子,我们如何为缺失的属性实现元对象编程。以下键应该注意下面的代码 - 类学生现在实现invokeMethod方法,它被调用,而不管该方法是否存在。class Example { static void main(String[] args) { Student mst = new Student(); mst.Name = "Joe"; mst.ID = 1; println(mst.Name); println(mst.ID); mst.AddMarks(); } } class Student implements GroovyInterceptable { protected dynamicProps = [:] void setProperty(String pName, val) { dynamicProps[pName] = val } def getProperty(String pName) { dynamicProps[pName] } def invokeMethod(String name, Object args) { return "called invokeMethod $name $args" }}以下代码的输出如下所示。请注意,即使方法Display不存在,也没有缺少方法异常的错误。Joe 1 元类此功能与MetaClass实现相关。在默认实现中,您可以访问字段而不调用它们的getter和setter。以下示例显示如何通过使用metaClass函数,我们能够更改类中的私有变量的值。class Example { static void main(String[] args) { Student mst = new Student(); println mst.getName() mst.metaClass.setAttribute(mst, 'name', 'Mark') println mst.getName() } } class Student { private String name = "Joe"; public String getName() { return this.name; } }以下代码的输出将是 - Joe Mark方法缺失Groovy支持methodMissing的概念。此方法与invokeMethod的不同之处在于,它仅在失败的方法分派的情况下被调用,当没有找到给定名称和/或给定参数的方法时。以下示例显示如何使用methodMissing。class Example { static void main(String[] args) { Student mst = new Student(); mst.Name = "Joe"; mst.ID = 1; println(mst.Name); println(mst.ID); mst.AddMarks(); } } class Student implements GroovyInterceptable { protected dynamicProps = [:] void setProperty(String pName, val) { dynamicProps[pName] = val } def getProperty(String pName) { dynamicProps[pName] } def methodMissing(String name, def args) { println "Missing method" } }以下代码的输出将是 - Joe 1 Missing method

Groovy 元对象编程