使用Groovy脚本引擎 根据表达式求值 或 反向解析构造对象

假设有这么一个需求:外部传入一个Map形式的字符串,如"[1:'A',2:'B']",现在要把这个字符串转换成map对象。

如果自己去解析并构造出map对象,显然很麻烦。

Groovy可以执行脚本,将一个脚本字符串传给GroovyShell,它再去sh.evaluate(expression).
所有我们也可以利用它来帮我们解析出map对象。
Map map = new GroovyShell().evaluate("[1:'A',2:'B']")

Groovy提供了一个帮助类Eval来方便地使用GroovyShell。可以用它来计算表达式的值(表达式不需要大量的绑定对象)

Map map = Eval.me("[1:'A',2:'B']")
Eval.me("""println "哈哈" """)

Eval还可以这么使用:
assert 10 == Eval.me(' 2 * 4 + 2')
assert 10 == Eval.me('x', 2, ' x * 4 + 2')    //x是变量,现在x=2,表达式是“x * 4 + 2”
assert 10 == Eval.x(2, ' x * 4 + 2')
assert 10 == Eval.xy(2, 4, ' x * y + 2')
assert 10 == Eval.xyz(2, 4, 2, ' x * y + z')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个示例的Groovy脚本,用于将XML格式的消息解析为Java对象: ```groovy import groovy.xml.* // 定义XML格式的消息 def xml = """ <user> <id>123</id> <name>John</name> <age>30</age> </user> """ // 解析XML为Java对象 def user = new XmlSlurper().parseText(xml) // 定义Java对象 class User { int id String name int age } // 将解析后的XML数据转换为Java对象 def userData = new User(id: user.id.toInteger(), name: user.name.text(), age: user.age.toInteger()) // 打印Java对象 println userData ``` 然后,我们可以使用Java的`ScriptEngine`类来执行Groovy脚本,完成数据解析为Java对象的操作。以下是一个示例: ```java import javax.script.*; public class GroovyScriptExecutor { public static void main(String[] args) throws Exception { // 创建Groovy脚本引擎 ScriptEngine engine = new ScriptEngineManager().getEngineByName("groovy"); // 定义Groovy脚本 String script = "import groovy.xml.*\n" + "def xml = '''<user><id>123</id><name>John</name><age>30</age></user>'''\n" + "def user = new XmlSlurper().parseText(xml)\n" + "class User { int id; String name; int age; }\n" + "def userData = new User(id: user.id.toInteger(), name: user.name.text(), age: user.age.toInteger())\n" + "return userData"; // 执行Groovy脚本 Object result = engine.eval(script); // 将结果转换为Java对象,并打印 System.out.println((User) result); } public static class User { int id; String name; int age; public User(int id, String name, int age) { this.id = id; this.name = name; this.age = age; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + '}'; } } } ``` 在上面的示例中,我们定义了一个名为`User`的Java类,用于存储解析后的数据。然后,我们使用`ScriptEngine`类来执行Groovy脚本,将XML格式的消息解析为Java对象,并将其打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值