文档章节

Java中加载Groovy文件及调用其方法

乐在克里特
 乐在克里特
发布于 2017/02/23 09:50
字数 337
阅读 17
收藏 0

本例中,我们会使用GroovyClassLoader来加载groovy脚本。

GroovyClassLoader是一个定制的类装载器,负责解释加载Java类中用到的Groovy类。它也能编译。清单2.21展示了如何使用GroovyClassLoader加载Groovy类并且调用该类的一个方法。

@Component
public class AccessComputeService {

    public static final Logger logger = LoggerFactory.getLogger(AccessComputeService.class);

    private static GroovyClassLoader loader;

    private static final ConcurrentHashMap<String,GroovyObject> groovyObjects = new ConcurrentHashMap<>();

    static {
        PathMatchingResourcePatternResolver resolver = new  PathMatchingResourcePatternResolver();
        loader = new GroovyClassLoader(AccessComputeService.class.getClassLoader());
        try {
            //适配读取classpath下面的*.groovy文件列表
            Resource[] resources = resolver.getResources("classpath:accessScore/*.groovy");
            if(resources==null || resources.length==0){
                logger.warn("未获取到groovy文件");
            }else{
                for (Resource resource: resources) {
                    try ( InputStream inputStream = AccessComputeService.class.getClassLoader()
                              .getResourceAsStream("accessScore/" + resource.getFilename())){
                        logger.info("加载准入评分groovy脚本:{}", resource.getFilename());
                        String text = CharStreams.toString(new InputStreamReader(inputStream, "UTF-8"));
                        Class groovyClass = loader.parseClass(text,resource.getFilename());
                        GroovyObject scriptInstance = (GroovyObject)groovyClass.newInstance();
                        groovyObjects.put(resource.getFilename().split("\\.")[0],scriptInstance);
                    }
                }
            }
        } catch (Exception e) {
            logger.error("groovy 引擎初始化失败!!!!!!!!",e);
        }
    }

    public void execute(String scriptFileName, String scriptFunctionName, Map<String, Object> dataMap) {
        //scriptFileName:文件名,scriptFunctionName:文件的方法,dataMap:参数
        Strong result = (String)groovyObjects.get(scriptFileName).invokeMethod(scriptFunctionName, dataMap);
    }
}

 

其他调用groovy的方式:(共5种)

1.编译成字节码(直接调编译后的.class文件)

2.使用GroovyShell && Bingding

(groovyShell.evaluate("groovy code"); binding.setVariable/getVariable)

3.使用GroovyScriptEngine && Bingding

(groovyScriptEngineengine.run("groovyCode.groovy", binding); binding.setVariable/getVariable)

4.使用GroovyClassLoader

(详见代码,class = loader.parseClass; groovyObject = class.newInstance; groovyObject.invokeMethod)

5.使用JSR223(Java 6 开始有的,支持JavaScript、JRuby、Jython和Groovy)
scriptEngine = scriptEngineManager.getEngineByName("groovy")
scriptEngine.eval
inv = (Invocable) engine;  
inv.invokeFunction("hello", new Object[]{...});  

summarize from

http://blog.csdn.net/eric_sunah/article/details/11541307

© 著作权归作者所有

共有 人打赏支持
乐在克里特
粉丝 15
博文 268
码字总数 394729
作品 0
杭州
程序员
《Groovy极简教程》第1章 Groovy简介

《Groovy极简教程》第1章 Groovy简介 Groovy: 绝妙的; 流行的; 最佳状态的。 A multi-faceted language for the Java platform. (JVM平台上的多面体语言。) 官网文档:http://www.groovy-lan...

程序员诗人
2017/04/16
0
0
java程序员为什么使用Groovy

一直听说java世界里有个Groovy,但是一直没时间去了解它究竟是一个怎么样子的。我们现在的项目里放了很多开源包,而且项目中做流程的时候,规则就是用Groovy实现的。近来闲来无事,于是开始认...

supperman
2012/11/16
0
24
groovy实现JSONRPC

介绍 groovy-jsonrpc JSONRPC的JAVA和GROOVY实现,能够将java类(包括groovy脚本)的公有静态方法通过jsonrpc2.0暴露出来。地址:https://github.com/wonder365/groovy-jsonrpc 。 JSONRPC2...

wonder365
2013/03/14
0
2
gradle/Groovy语法

Groovy官网的介绍(http://www.groovy-lang.org/download.html#gvm) Gradle API 文档: https://docs.gradle.org/current/dsl/org.gradle.api.invocation.Gradle.html 深入理解Android(一)......

shareus
04/27
0
0
在Idea中测试各JVM语言的交互性

背景: 假设出现这样的场景,一个Java项目中,需要用其他语言来编写相关模块,但需要能被Java调用 测试工具:Idea12 测试语言:Groovy、Scala、Kotlin 测试方法:在Java代码中调用其他语言的...

max佩恩
2013/03/09
0
2

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 Windows 中以服务方式自动重启的原因

针对长时间使用的 Confluence,我们推荐你配置 Confluence 自动随操作系统重启而启动。针对一些 Windows 的服务器,这意味着需要让 Confluence 以服务的方式运行。 有下面 2 种方式来以服务的...

honeymose
40分钟前
2
0
day93-20180920-英语流利阅读-待学习

时尚之觞:外表光鲜靓丽,其实穷得要命 Lala 2018-09-20 1.今日导读 讲到时尚界,我们脑海里浮现的可能都是模特和设计师光鲜靓丽、从容潇洒的模样。可是,最近在法国出版的一本书却颠覆了我们...

飞鱼说编程
59分钟前
3
0
maven的pom.xml用解决版本问题

maven管理库依赖,有个好处就是连同库的依赖的全部jar文件一起下载,免去手工添加的麻烦,但同时也带来了同一个jar会被下载了不同版本的问题,好在pom的配置里面允许用<exclusion>来排除一些...

JAVA码猿
今天
1
0
20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
2
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
382
18

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部