`

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

阅读更多

本例中,我们会使用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的方式

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

分享到:
评论

相关推荐

    groovy和Java相互调用1

    描述中提到的Groovy调用Java的过程是“无缝”的,这意味着Groovy对Java API的集成非常紧密,使得开发者可以自然地在Groovy中使用Java的功能。 Java调用Groovy类则稍微复杂一些,通常有两种主要方法: 1. **方法1:...

    Java调用Groovy,实时动态加载数据库groovy脚本

    我们可以编写一个Java方法,从MongoDB中查询到Groovy脚本,然后利用上述的Groovy调用机制执行这些脚本。 例如,我们可能会有一个MongoDB集合,其中每个文档包含一个字段存储Groovy脚本。Java代码会连接到MongoDB,...

    Java调用Groovy

    例如,Java可以创建Groovy类的实例,调用其方法: ```java import groovy.lang.GroovyObject; import groovy.lang.GroovyClassLoader; Class groovyClass = new GroovyClassLoader().parseClass( "class Hello...

    基于groovy实现 java脚本动态编译、部署、发布;可以通过脚本直接调用dubbo接口.zip

    在Java环境中,部署通常意味着将代码打包成JAR或WAR文件,然后将其上传到服务器。由于Groovy脚本可以直接作为文本文件存储,因此部署Groovy脚本非常简单,只需要将脚本文件复制到服务器上的相应位置即可。发布则涉及...

    hugo110-java_run_groovy-master_java_

    - **GroovyObject接口**:Groovy类自动实现`GroovyObject`接口,这使得Java可以调用Groovy对象的方法。 2. **Groovy的优势**: - **动态性**:Groovy支持动态类型,这意味着变量的类型可以在运行时改变,这在编写...

    java在嵌入运行groovy代码1

    在同一个 `GroovyShell` 实例中,所有变量值都会保留在一个“session”中,这意味着你在后续的 `evaluate` 调用中可以继续访问和修改这些变量。 例如,以下代码展示了如何在 GroovyShell 中调用方法: ```java ...

    Groovy在Spring中的简单使用

    在测试中,可以使用 Spring 的 ApplicationContext 来获取 helloWorldService bean,并调用其 sayHello 方法,以验证 Groovy 脚本的正确性。 Groovy 在 Spring 中的使用可以带来许多好处,例如可以动态修改业务逻辑...

    Groovy调用Weka生成决策树

    本篇文章将重点讲解如何使用Groovy调用Weka来生成决策树。 在Groovy中调用Weka,首先需要确保你的环境中已经安装了Weka库。这通常通过Maven或Gradle等构建工具添加依赖来实现。对于Maven,可以在pom.xml文件中添加...

    java动态代码执行

    GroovyClassLoader是Groovy提供的另一个关键工具,它允许我们在运行时动态加载Groovy类。我们可以使用这个类来编译和执行Groovy源代码字符串。下面是一个使用GroovyClassLoader的例子: ```java import groovy.lang...

    Groovy大量计算导致oom的解决办法

    下载的资源文件中,封装了并发计算以及内存溢出解决方案的工具类GroovyEngine.java,调用示例: GroovyEngine engine = GroovyEngine.getInstance(); engine.put("a",1); engine.put("b",2); Object v1 = engine....

    Groovy中文教程

    5. 链式方法调用:Groovy允许连续调用对象方法,如`list.add("item").sort().reverse()`。 在OFBiz(Open For Business Project)这个开源的企业级应用框架中,Groovy也被广泛使用。OFBiz是一个基于Java的全面的...

    Android Studio3.0开发JNI流程------C++调用Java以及Java调用C++,C++/Java互相调用

    创建`native-lib.cpp`文件,这里我们将实现C++调用Java的方法。首先,我们需要声明Java方法的本地方法ID,然后使用JNIEnv接口调用Java方法: ```cpp #include #include extern "C" JNIEXPORT jstring JNICALL ...

    jni C调用java示例

    JNI,全称Java Native ...通过在Java中定义本地方法,在C/C++中编写其实现,再通过NDK编译工具链进行编译,最终在Android应用中无缝调用这些本地方法。这个示例展示了从创建本地方法到实现和编译C代码的完整流程。

    android JNI C 调用Java

    在Java代码中,我们需要定义对应的native方法,并使用`System.loadLibrary`加载库: ```java public class MyActivity extends AppCompatActivity { static { System.loadLibrary("ccalljava"); // 假设库名为...

    java调用c++方法代码完整示例

    总结,Java调用C++方法的关键在于使用JNA库,定义C++库的Java接口,加载库并调用相应函数。通过这种方式,可以充分利用已有的C++代码库,同时保持Java应用程序的可移植性和易管理性。记得在不同操作系统上调整库文件...

    groovy-api-chm

    学习和理解这些CHM文件中的内容,开发者可以更好地掌握Groovy语言的各个方面,包括其动态特性、元编程能力以及与Java的互操作性。这对于开发基于Groovy的应用程序、脚本或者增强现有的Java项目都至关重要。通过深入...

    java读取ini文件jar

    在这个示例中,我们首先创建了一个`IniConfiguration`对象,然后通过调用`read()`方法加载Ini文件。接下来,我们可以使用`configurationAt()`方法获取特定section的配置,并通过`getString()`方法读取特定key的值。 ...

    加载资源文件的PDF

    在Android开发中,加载资源文件,尤其是PDF文档,是一个常见的需求。这个"加载资源文件的PDF"项目提供了一个完美的示例,演示了如何在Android应用中实现PDF的加载、缩放以及保持清晰度。以下是对这个项目的详细解析...

    groovy-all.jar-生成JasperReport所要包含的包

    这个单一的JAR文件包含了大量的Groovy模块,包括编译器、类加载器、标准库以及Groovy语言的其他相关组件。这样,你无需为每个单独的Groovy库添加依赖,只需要引用`groovy-all.jar`即可。 描述中提到的`groovy-1.7.2...

Global site tag (gtag.js) - Google Analytics