Groovy中的Init / Enter / Exit上下文管理器模拟?

时间:2019-06-23 11:15:02

标签: groovy

我想知道用init,enter和exit方法来完成类似于Python的上下文管理器的常规方法是什么。这是Python中的基本示例:

class ContextManager(): 
    def __init__(self): 
        print('init method called') 

    def __enter__(self): 
        print('enter method called') 
        return self

    def __exit__(self, exc_type, exc_value, exc_traceback): 
        print('exit method called') 


with ContextManager() as manager: 
    print('with statement block') 

输出:

init method called
enter method called
with statement block
exit method called

2 个答案:

答案 0 :(得分:2)

如果需要自己的入口点,则可以编写自己的基类来控制这种行为。

class ContextManager {
    ContextManager() { println "init" }
    void enter() { println "enter" }
    void exit(Throwable t=null) { println "exit ${t?:""}" }
    String getInner() { "inner" }

    final run(Closure f) {
        try {
            enter()
            f(this)
            exit()
        }
        catch (Throwable t) {
            exit(t)
        }
    }
}

def outer = "outer"

new ContextManager().run { manager ->
    println outer
    println manager.inner
    println "body"
}

输出:

init
enter
outer
inner
body
exit 

答案 1 :(得分:0)

Groovy可以使用元编程为进入和退出完成类似的操作。 Groovy具有运行时和编译时元编程。使用运行时元编程,您可以通过在类中使用invokeMethod来执行类似的操作。

编译时元编程要困难一些,因为您要在编译器级别进行处理:

我制作了一个Grails插件,这将是一个更加复杂的示例,它使我可以执行类似的操作,但调用方法周围的闭包:

希望其中一些帮助...