问题描述
该笔记将记录:在 Apache Groovy 中,与元编程相关内容,以及常见问题的处理方法。
解决方案
为对象添加新属性及方法
class Foo {} f = new Foo() f.metaClass.unVariable = "something" assert f.hasProperty("unVariable") == true assert f.unVariable == "something" f.metaClass.unMethod = { println "Hello World." } assert f.unMethod() == "Hello World."
invokeMethod
在方法调用前,如果实现 invokeMethod() 方法,将调用该方法:
class MyClass implements GroovyInterceptable { def invokeMethod(String name, args) { System.out.println("This method is called method $name") def metaMethod = metaClass.getMetaMethod(name, args) metaMethod.invoke(this, args) } def myMethod() { "Hi!" } } def instance = new MyClass() instance.myMethod()
或者,通过 metaClass 实现:
Integer.metaClass.invokeMethod = { String name, args -> println("This method is called method $name") def metaMethod = delegate.metaClass.getMetaMethod(name, args) metaMethod.invoke(delegate, args) } 1.toString()
参考文献
How to verify if an object has certain property?
Dynamically add a property or method to an object in groovy
The Apache Groovy programming language – Runtime and compile-time metaprogramming
reflection – Find out a method’s name in Groovy – Stack Overflow