Groovy   发布时间:2022-04-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Groovy小结:java调用Groovy方法并传递参数大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

@(JAVA总结)

1. 场景描述

在网上查了资料发现,java有三种方式调用groovy脚本。但是真正在实际的服务器环境中,嵌入groovy脚本往往需要满足下面的条件:

  1. 可以直接调用groovy脚本中的方法
  2. 能传递对象到groovy方法中,不仅仅是字符串
  3. 提供脚本缓存机制,不用每次调用脚本的时候,都到磁盘读取
  4. 修改groovy后能实时生效

只有满足了上面的这些要求,才能安心的将其嵌入到现有的Java@L_874_6@服务中。
下面就来具体探讨下具体实现的步骤。

2. 解决方

其实,GroovyScriptENGIne类就已经提供了上面所说的功能
主要使用GroovyScriptENGIne.loadScriptByName来读取脚本,loadScriptByName方法内部提供了缓存功能,在读取groovy脚本的时候,会优先从缓存中读取,如果缓存中没有的话,才去读取脚本,如下:

Groovy小结:java调用Groovy方法并传递参数

2.1 相关测试类和脚本

后面的测试后,会用到下面的java类和groovy脚本。

2.1.1 测试类Person.java

该类用于测试传递Java对象到Groovy脚本中

@H_403_43@public @H_403_43@class Person { @H_403_43@public String name; @H_403_43@public String address; @H_403_43@public Integer age; @H_403_43@public Person(String name,String addr,Integer agE){ @H_403_43@this.name = name; @H_403_43@this.address = addr; @H_403_43@this.age = age; } @H_403_43@public String toString(){ @H_403_43@return String.format("[Person: name:%s,address:%s,age:%s]",name,address,agE); } }

2.1.2 测试脚本Hello2.groovy

下面脚本中的两个方法用于测试方法的无参调用和带参调用

@H_403_43@def HelloWithout@R_360_1403@{ println "start to call HelloWithoutParam!" @H_403_43@return "success,HelloWithoutParam"; } @H_403_43@def HelloWithParam(person,id){ println "start to call HelloWithParam,param{person:" + person + ",id:" + id + "}"; @H_403_43@return "success,HelloWithParam"; }

2.2 java调用Groovy脚本方法(无参)

@H_403_43@public @H_403_43@static @H_403_43@void testGroovy2(){ @H_403_43@try { Class scriptClass = groovyScriptENGIne.loadScriptByName("Hello2.groovy"); GroovyObject scripTinstance = (GroovyObject)scriptClass.newInstance(); Object ret = scripTinstance.invokeMethod("HelloWithoutParam",@H_403_43@null); System.out.println("testGroovy2:" + ret); } @H_403_43@catch (Exception E) { e.printStackTrace(); System.out.println("Exception e="+e.toString()); } }

执行结果:
start to call HelloWithoutParam!
testGroovy2: success,HelloWithoutParam

2.3 java调用Groovy脚本方法(带参)

@SuppressWarnings({ "rawtypes" }) @H_403_43@public @H_403_43@static @H_403_43@void testGroovy3(){ @H_403_43@try { Person person = @H_403_43@new Person("wchi","nanjing",30); Class scriptClass = groovyScriptENGIne.loadScriptByName("Hello2.groovy"); GroovyObject scripTinstance = (GroovyObject)scriptClass.newInstance(); Object ret = scripTinstance.invokeMethod("HelloWithParam",@H_403_43@new Object[]{person,"lxi"}); System.out.println("testGroovy3:" + ret); } @H_403_43@catch (Exception E) { e.printStackTrace(); System.out.println("Exception e="+e.toString()); } }

返回结果:
start to call HelloWithParam,param{person:[Person: name:wchi,address:nanjing,age:30],id:lxi}
testGroovy3: success,HelloWithParam

2.4 封装的公用类

可以将上面的代码封装成公用类,这样就方便很多,如下:

@H_403_43@public @H_403_43@class GroovyCommonUtil { @H_403_43@private @H_403_43@static @H_403_43@final Logger log = LoggerFactory.getLogger(GroovyCommonUtil.class); //该变量用于指明groovy脚本所在的父目录 @H_403_43@static String root[]=@H_403_43@new String[]{"bin/groovy/"}; @H_403_43@static GroovyScriptENGIne groovyScriptENGIne; @H_403_43@static{ @H_403_43@try { groovyScriptENGIne=@H_403_43@new GroovyScriptENGIne(root); } @H_403_43@catch (IOException E) { e.printStackTrace(); } } /** * 用于调用指定Groovy脚本中的指定方法 * @param scriptName 脚本名称 * @param methodName 方法名称 * @param params 方法参数 * @return */ @SuppressWarnings({ "rawtypes"}) @H_403_43@public Object invokeMethod(String scriptName,String methodName,Object... params) @H_403_43@throws Exception{ Object ret = @H_403_43@null; Class scriptClass = @H_403_43@null; GroovyObject scripTinstance = @H_403_43@null; @H_403_43@try { scriptClass = groovyScriptENGIne.loadScriptByName(scriptName); scripTinstance = (GroovyObject)scriptClass.newInstance(); } @H_403_43@catch (resourceException | ScriptException | InstantiationException | illegalaccessexception e1) { log.warn("加载脚本["+scriptName+"]出现异常",e1); @H_403_43@throw @H_403_43@new Exception("加载脚本"+scriptName+"失败"); } @H_403_43@try { ret = (String)scripTinstance.invokeMethod(methodName,params); } @H_403_43@catch (IllegalArgumentexception E) { log.warn("执行方法" + methodName + "参数出现异常,参数为" + params,E); @H_403_43@throw @H_403_43@new Exception("调用方法[" + methodName + "]失败,因参数不合法"); } @H_403_43@catch(Exception E){ log.warn("执行方法" + methodName + "出现异常",E); @H_403_43@throw @H_403_43@new Exception("调用方法[" + methodName + "]失败"); } @H_403_43@return ret; }

使用上面的公用类,改写的测试代码如下:

/** * 测试没有参数的方法调用 */ @H_403_43@public @H_403_43@static @H_403_43@void testGroovyWithoutParam(){ String result = (String)GroovyCommonUtil.invokeMethod("Hello2.groovy","HelloWithoutParam"); System.out.println("testGroovy4: " + result + "\n"); } /** * 测试携带参数的方法调用 */ @H_403_43@public @H_403_43@static @H_403_43@void testGroovyWithParam(){ Person person = @H_403_43@new Person("wchi",30); String result = (String)GroovyCommonUtil.invokeMethod("Hello2.groovy","HelloWithParam",person,"testGroovy4"); System.out.println("testGroovy4: " + result + "\n"); }

大佬总结

以上是大佬教程为你收集整理的Groovy小结:java调用Groovy方法并传递参数全部内容,希望文章能够帮你解决Groovy小结:java调用Groovy方法并传递参数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。