ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

我如何说服GroovyShell维护eval()调用的状态?

2019-12-10 21:02:38  阅读:331  来源: 互联网

标签:groovy scripting groovyshell java


我正在尝试使用Groovy为我的应用程序创建交互式脚本/宏模式.该应用程序是OSGi,脚本可能需要的很多信息都不是预先知道的.我认为我可以使用GroovyShell并在加载OSGi捆绑包时多次调用eval()连续追加到名称空间. GroovyShell通过多个eval调用维护变量状态,但不维护类定义或方法.

目标:在启动期间创建基类.在OSGi捆绑软件加载时,根据需要创建派生类.

解决方法:

我不确定在eval之间不存在声明的类的含义,以下两个脚本在逐个回避时可以按预期工作:

class C {{println 'hi'}}
new C()

new C()

但是,方法绑定到声明它们的类,并且GroovyShell为每个实例创建一个新类.如果您不需要任何脚本的返回值并且它们是真正的脚本(不是具有主方法的类),则可以将以下内容附加到每个评估的脚本的末尾.

Class klass = this.getClass()
this.getMetaClass().getMethods().each {
  if (it.declaringClass.cachedClass == klass) {
    binding[it.name] = this.&"$it.name"
  }
}

如果您依赖于返回值,则可以在评估过程中手动管理评估并运行脚本(警告,未经测试的代码紧随其后,仅用于说明性用途)…

String scriptText = ...
Script script = shell.parse(scriptText)
def returnValue = script.run()
Class klass = script.getClass()
script.getMetaClass().getMethods().each {
  if (it.declaringClass.cachedClass == klass) {
    shell.context[it.name] = this.&"$it.name"
  }
}
// do whatever with returnValue...

最后一个警告,我确定您知道.静态类型的变量不保存在评估之间,因为它们没有存储在绑定中.因此,在先前的脚本中,变量“ klass”将不会在脚本调用之间保留,而是消失.要纠正这一点,只需在首次使用所有变量时删除类型声明,这意味着它们将被读取并写入绑定中.

标签:groovy,scripting,groovyshell,java
来源: https://codeday.me/bug/20191210/2104238.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有