课程表

Groovy课程

工具箱
速查手册

Groovy 元对象编程

当前位置:免费教程 » Java相关 » Groovy

元对象编程或MOP可以用于动态调用方法,并且可以即时创建类和方法。

那么这是什么意思呢?让我们考虑一个叫Student的类,它是一个没有成员变量或方法的空类。假设你必须在这个类上调用以下语句。

  1. Def myStudent = new Student()
  2. myStudent.Name = Joe”;
  3. myStudent.Display()

现在在元对象编程中,即使类没有成员变量Name或方法Display(),上面的代码仍然可以工作。

这如何工作?那么,为了这个工作,一个人必须实现GroovyInterceptable接口挂钩到Groovy的执行过程。以下是该接口的可用方法。

  1. Public interface GroovyInterceptable {
  2. Public object invokeMethod(String methodName, Object args)
  3. Public object getproperty(String propertyName)
  4. Public object setProperty(String propertyName, Object newValue)
  5. Public MetaClass getMetaClass()
  6. Public void setMetaClass(MetaClass metaClass)
  7. }

所以在上面的接口描述中,假设你必须实现invokeMethod(),它会被调用的每个方法,要么存在或不存在。

缺失属性

所以,让我们看一个例子,我们如何为缺失的属性实现元对象编程。以下键应该注意以下代码。

  • 类Student没有定义名为Name或ID的成员变量。

  • 类Student实现GroovyInterceptable接口。

  • 有一个称为dynamicProps的参数,将用于保存即时创建的成员变量的值。

  • 方法getproperty和setproperty已被实现以在运行时获取和设置类的属性的值。

  1. class Example {
  2. static void main(String[] args) {
  3. Student mst = new Student();
  4. mst.Name = "Joe";
  5. mst.ID = 1;
  6. println(mst.Name);
  7. println(mst.ID);
  8. }
  9. }
  10.  
  11. class Student implements GroovyInterceptable {
  12. protected dynamicProps=[:]
  13. void setProperty(String pName,val) {
  14. dynamicProps[pName] = val
  15. }
  16. def getProperty(String pName) {
  17. dynamicProps[pName]
  18. }
  19. }

在线运行实例

以上代码的输出将是 -

  1. Joe
  2. 1

缺失方法

所以,让我们看一个例子,我们如何为缺失的属性实现元对象编程。以下键应该注意下面的代码 -

  • 类学生现在实现invokeMethod方法,它被调用,而不管该方法是否存在。

  1. class Example {
  2. static void main(String[] args) {
  3. Student mst = new Student();
  4. mst.Name = "Joe";
  5. mst.ID = 1;
  6. println(mst.Name);
  7. println(mst.ID);
  8. mst.AddMarks();
  9. }
  10. }
  11. class Student implements GroovyInterceptable {
  12. protected dynamicProps = [:]
  13. void setProperty(String pName, val) {
  14. dynamicProps[pName] = val
  15. }
  16. def getProperty(String pName) {
  17. dynamicProps[pName]
  18. }
  19. def invokeMethod(String name, Object args) {
  20. return "called invokeMethod $name $args"
  21. }
  22. }

在线运行实例

以上代码的输出如下所示。请注意,即使方法Display不存在,也没有缺少方法异常的错误。

  1. Joe
  2. 1

元类

此功能与MetaClass实现相关。在默认实现中,您可以访问字段而不调用它们的getter和setter。以下示例显示如何通过使用metaClass函数,我们能够更改类中的私有变量的值。

  1. class Example {
  2. static void main(String[] args) {
  3. Student mst = new Student();
  4. println mst.getName()
  5. mst.metaClass.setAttribute(mst, 'name', 'Mark')
  6. println mst.getName()
  7. }
  8. }
  9.  
  10. class Student {
  11. private String name = "Joe";
  12. public String getName() {
  13. return this.name;
  14. }
  15. }

在线运行实例

以上代码的输出将是 -

  1. Joe
  2. Mark

方法缺失

Groovy支持methodMissing的概念。此方法与invokeMethod的不同之处在于,它仅在失败的方法分派的情况下被调用,当没有找到给定名称和/或给定参数的方法时。以下示例显示如何使用methodMissing。

  1. class Example {
  2. static void main(String[] args) {
  3. Student mst = new Student();
  4. mst.Name = "Joe";
  5. mst.ID = 1;
  6. println(mst.Name);
  7. println(mst.ID);
  8. mst.AddMarks();
  9. }
  10. }
  11.  
  12. class Student implements GroovyInterceptable {
  13. protected dynamicProps = [:]
  14. void setProperty(String pName, val) {
  15. dynamicProps[pName] = val
  16. }
  17. def getProperty(String pName) {
  18. dynamicProps[pName]
  19. }
  20. def methodMissing(String name, def args) {
  21. println "Missing method"
  22. }
  23. }

在线运行实例

以上代码的输出将是 -

  1. Joe
  2. 1
  3. Missing method
转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号