在调用之前更改和添加方法的参数
Changing and adding arguments of method before invocation
我想通过拦截对某些方法的调用来重现默认参数的行为。当 display 方法在没有参数的情况下被调用时,下面的代码试图给出一个默认参数:
class Thing
{
void display(String text)
{
println(text)
}
def invokeMethod(String name, args)
{
if(name == "display" && args.length == 0)
{
metaClass.getMetaMethod(name, ["some text"]).
invoke(this, "some text")
}
else
{
metaClass.getMetaMethod(name, args).
invoke(this, args)
}
}
}
Thing thing = new Thing()
thing.display("stuff") //prints "stuff"
thing.display() //nothing happens
但是,这不起作用;没有给出参数时不打印任何内容。
这个例子不是很有用,但我想让它工作;我的下一个目标确实是创建可以在其名称中给出参数的方法。示例:
Add1And2()// should return 3
Add4And9()// should return 13
拦截对这些不存在的方法的调用并调用一个现有的方法,该方法将使用不存在的方法名称中使用的数字进行加法运算,这样就可以...
Class Thing
应该如下实施 GroovyInterceptable
以使 invokeMethod
工作:
class Thing implements GroovyInterceptable {
void display(String text) {
println(text)
}
def invokeMethod(String name, args) {
if(name == "display" && args.length == 0) {
metaClass.getMetaMethod(name).invoke(this, "some text")
} else {
metaClass.getMetaMethod(name, args).invoke(this, args)
}
}
}
Thing thing = new Thing()
thing.display("stuff") //prints "stuff"
thing.display()
我想通过拦截对某些方法的调用来重现默认参数的行为。当 display 方法在没有参数的情况下被调用时,下面的代码试图给出一个默认参数:
class Thing
{
void display(String text)
{
println(text)
}
def invokeMethod(String name, args)
{
if(name == "display" && args.length == 0)
{
metaClass.getMetaMethod(name, ["some text"]).
invoke(this, "some text")
}
else
{
metaClass.getMetaMethod(name, args).
invoke(this, args)
}
}
}
Thing thing = new Thing()
thing.display("stuff") //prints "stuff"
thing.display() //nothing happens
但是,这不起作用;没有给出参数时不打印任何内容。
这个例子不是很有用,但我想让它工作;我的下一个目标确实是创建可以在其名称中给出参数的方法。示例:
Add1And2()// should return 3
Add4And9()// should return 13
拦截对这些不存在的方法的调用并调用一个现有的方法,该方法将使用不存在的方法名称中使用的数字进行加法运算,这样就可以...
Class Thing
应该如下实施 GroovyInterceptable
以使 invokeMethod
工作:
class Thing implements GroovyInterceptable {
void display(String text) {
println(text)
}
def invokeMethod(String name, args) {
if(name == "display" && args.length == 0) {
metaClass.getMetaMethod(name).invoke(this, "some text")
} else {
metaClass.getMetaMethod(name, args).invoke(this, args)
}
}
}
Thing thing = new Thing()
thing.display("stuff") //prints "stuff"
thing.display()