我需要拦截预定义Java类的方法调用。例如,假设我需要拦截String类拆分方法,我该怎么做?
我尝试了this,但是我不希望最终用户通过使用代理块包装他们的代码来更改代码。
使用Groovy有什么办法可以实现吗?
答案 0 :(得分:1)
您希望MetaClass
使用ExpandoMetaClass.enableGlobally()
//call 'enableGlobally' method before adding to supplied class
String.metaClass.split = { regex ->
println "calling split from $delegate with $regex"
delegate.split regex, 22
}
{{1}}
答案 1 :(得分:1)
如果你要做的是拦截对特定方法的调用,你可以做这样的事情......
// intercept calls to the split method on java.lang.String
String.metaClass.split = { String arg ->
// do whatever you want to do
}
如果您想要做的是拦截对特定方法的调用并除了调用原始方法之外还要执行一些操作(比如使用您自己的逻辑包装真实方法),您可以执行以下操作:
// get a reference to the original method...
def originalSplit = String.metaClass.getMetaMethod('split', [String] as Class[])
// now add your own version of the method to the meta class...
String.metaClass.split = { String arg ->
// do something before invoking the original...
// invoke the original...
def result = originalSplit.invoke(delegate, arg)
// do something after invoking the original...
// return the result of invoking the original
result
}
我希望有所帮助。