返回顶部
首页 > 资讯 > 后端开发 > Python >Java动态脚本Groovy
  • 404
分享到

Java动态脚本Groovy

2024-04-02 19:04:59 404人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1.Groovy特性 2.核心涉及 3.Java与Groovy转换 第一步:引入Groovy依赖 第二步:创建interface接口声明方法 第三步:在resources目录下创

1.Groovy特性

可将java代码在Groovy脚本动态编码、代码被修改达到不重启服务的目的(类似于热部署)

2.核心涉及

  • ClassLoader:就是类的装载器,它使JVM可以动态的载入Java类,JVM并不需要知道从什么地方(本地文件、网络等)载入Java类,这些都由ClassLoader完成。
  • GroovyClassLoader:动态地加载一个脚本并执行它的行为。GroovyClassLoader是一个定制的类装载器,负责解释加载Java类中用到的Groovy类。

3.Java与Groovy转换

第一步:引入Groovy依赖


   <!--Groovy脚本依赖-->
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy</artifactId>
            <version>2.5.14</version>
        </dependency>

第二步:创建interface接口声明方法


public interface CallAnalysis {
     default void load() {
    }
}

第三步:在resources目录下创建.groovy文件


package groovy

import com.example.groovy.testgroovy.task.CallAnalysis
import groovy.util.logging.Slf4j

@Slf4j
class CallAnalysisImpl implements CallAnalysis{

    @Override
    void load() {
        log.info("我被Groovy脚本加载...")
    }
}

第四步:创建Groovy脚本装载类,动态解析脚本为Class


package com.example.groovy.testgroovy.task;

import groovy.lang.GroovyClassLoader;

public class GroovyUtils {

    private final static ClassLoader classLoader = GroovyUtils.class.getClassLoader();//获取当前类装载器
    //ClassLoader:就是类的装载器,它使JVM可以动态的载入Java类,JVM并不需要知道从什么地方(本地文件、网络等)载入Java类,这些都由ClassLoader完成。

    public final static GroovyClassLoader groovyClassLoader = new GroovyClassLoader(classLoader);
    //GroovyClassLoader:负责在运行时编译groovy源代码为Class的工作,从而使Groovy实现了将groovy源代码动态加载为Class的功能。

    
    public static <T> T instanceTaskGroovyScript(String script) throws IllegalAccessException, InstantiationException {
        Class taskClz = groovyClassLoader.parseClass(script);
        T instance = (T) taskClz.newInstance();
        return instance;
    }
}

第五步:读取脚本内容,执行脚本


package com.example.groovy.testgroovy.task;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.IOException;


@Slf4j
@Component
public class CallAnalysisGroovyTask {


    
    public static String getGroovy() {
        String context = "";
        try {
            String path = "E:\\ideaFile\\testgroovy\\src\\main\\resources\\groovy\\CallAnalysisImpl.groovy";
            context = FileUtils.readFileToString(new File(path));//将脚本内容转为字符串
        } catch (IOException e) {
            log.error("file is not found[{}]", e);
        }
        return context;
    }

    
    public static void execGroovy(String script) {
        try {
            CallAnalysis objClass = GroovyUtils.instanceTaskGroovyScript(script);//获取实例对象
            objClass.load();//调用脚本方法
        } catch (Exception t) {
            log.error("execGroovy file {} error", script);
        }
    }

    
    public static void main(String[] args) {
        System.out.println("==================");
        CallAnalysisGroovyTask task = new CallAnalysisGroovyTask();
        String script = task.getGroovy();//获取脚本
        execGroovy(script);//实例化脚本,执行方法
        System.out.println("==================");
    }
}

4.Groovy特性验证

利用Groovy脚本特性,不重启服务,实时修改数据

第一步:将之前Groovy脚本数据修改。存于数据库表中,动态加载脚本


@Slf4j
class CallAnalysisImpl implements CallAnalysis {

    private int anInt = 10;
    private int bnInt = 10;

    @Override
    void load() {
        log.info("当前类:[{}]", this.getClass().getName())
        log.info("我被Groovy脚本加载...")
        log.info("计算结果:[{}]", (anInt + bnInt))
    }
}


第二步:数据库表中:添加、查询Groovy脚本,动态加载执行


 
    @GetMapping("/saveScript")
    public String saveScript() {
        String scriptStr = callAnalysisGroovyTask.getGroovy();
        Script script = new Script();//实体类对象
        script.setScript(scriptStr);//脚本内容
        script.setRuleId("1");//规则id
        script.setScriptName("演示一");//脚本名称
        service.save(script);
        return "添加成功";
    }


    
    @GetMapping("/groovy")
    public String groovy(final String ruleId) {
        Script scr = scriptService.findScriptByRuleId(ruleId);//根据规则id查询
        String scriptStr = scr.getScript();
        callAnalysisGroovyTask.execGroovy(scriptStr);
        return scriptStr;
    }


添加结果:

 查询结果、控制台执行结果:

第三步:多次修改表数据值,查看执行结果

5.总语

目的达成,可见在不重启服务时,多次修改数据,脚本内容都会被动态加载。此处只是简单举例验证,可自行扩展

到此这篇关于Java动态脚本Groovy的文章就介绍到这了,更多相关Java动态脚本Groovy内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java动态脚本Groovy

本文链接: https://lsjlt.com/news/159849.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java动态脚本Groovy
    目录1.Groovy特性 2.核心涉及 3.Java与Groovy转换 第一步:引入Groovy依赖 第二步:创建interface接口声明方法 第三步:在resources目录下创...
    99+
    2024-04-02
  • java 内嵌Groovy动态脚本操作
    固定的策略有时候还是无法满足千变万化的需求变动,一方面需要支持特定的用户需求,另一方面又得尽可能的复用代码,避免重复开发,这就需要将这部分的特殊的需求剥离出来,采用动态配置规则的方式...
    99+
    2024-04-02
  • Java动态脚本Groovy获取Bean技巧
    目录一、使用BeanFactoryPostProcessor注入Bean: 第一步:创建实现SpringUtils 接口工具(组件)来获取spring bean 第二步:创建Groo...
    99+
    2024-04-02
  • Java动态脚本Groovy的特性是什么
    这篇文章主要为大家展示了“Java动态脚本Groovy的特性是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java动态脚本Groovy的特性是什么”这篇文章吧。1.Groovy特性可将ja...
    99+
    2023-06-22
  • Java动态脚本Groovy获取Bean技巧是什么
    本篇内容介绍了“Java动态脚本Groovy获取Bean技巧是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Groovy中不能使用@A...
    99+
    2023-06-22
  • java中调用groovy脚本
    java中调用groovy脚本...
    99+
    2023-06-03
  • SpringBoot整合Groovy脚本实现动态编程详解
    目录Groovy简介应用场景集成与使用第一步、与SpringBoot集成1、pom.xml文件如下:第二步、写出Groovy版本的“Hello World”1...
    99+
    2024-04-02
  • java脚本引擎Groovy实战
    前言 互联网时代随着业务的飞速发展,不仅产品迭代、更新的速度越来越快,个性化需求也是越来越多。如何快速的满足各种业务的个性化需求是我们要重点思考的问题。我们开发的系统如何才能做到热部署,不重启服务就能适应各种规则变化呢?实现业务和规...
    99+
    2023-09-16
    java 开发语言 微服务
  • java如何调用Groovy脚本
    目录一、使用二、实现原理三、调用groovy脚本实现方式1.使用GroovyClassLoader2.使用ScriptEngine3.使用GroovyShell四、性能优化五、解决方...
    99+
    2023-02-14
    java调用Groovy脚本 Groovy脚本调用 java Groovy脚本
  • Java怎么调用groovy脚本
    这篇文章主要介绍“Java怎么调用groovy脚本”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java怎么调用groovy脚本”文章能帮助大家解决问题。使用方式GroovyShellGroovyS...
    99+
    2023-07-06
  • Java调用groovy脚本的方式分享
    目录前言使用方式GroovyShellGroovyClassLoaderScriptEngineManager前言 Groovy 是一种基于 JVM 的动态语言,与 Java 语言紧...
    99+
    2023-05-15
    Java调用groovy脚本方法 Java调用groovy脚本 Java调用groovy Java groovy
  • 详解Java执行groovy脚本的两种方式
    记录Java执行groovy脚本的两种方式,简单粗暴: 一种是通过脚本引擎ScriptEngine提供的eval(String)方法执行脚本内容;一种是执行groovy脚本; 二者都...
    99+
    2024-04-02
  • node.js 动态执行脚本
    node.js最近新增了虚拟机模块,其实也不能说是新增的,只是把一些内部接口暴露出来罢了,从2.x就有了。我们可以从node / src / node.js看到这些代码: var Script = pr...
    99+
    2022-06-04
    脚本 动态 node
  • Springboot中动态语言groovy介绍
    目录GroovypomResourceScriptSourceDatabaseScriptSourceGroovy Groovy是一种基于Java的语法的基于JVM的编程语言。Gro...
    99+
    2024-04-02
  • Jython vs Groovy:动态语言之争
    语法 Jython基于Python语法,而Groovy基于Java语法。对于来自不同编程背景的开发人员来说,这可能是最重要的区别。Jython的语法更简单、更简洁,类似于Python。Groovy的语法更复杂,与Java类似,包括类型检查...
    99+
    2024-03-15
    Jython
  • java脚本怎么设置多个动态变量
    在Java脚本中,可以使用多个变量来存储和操作不同的值。下面是几种设置多个动态变量的方法:1. 使用单独的变量来存储每个值:```j...
    99+
    2023-09-15
    java
  • Java详解ScriptEngine接口动态执行JS脚本
    目录简介Eval(String script)描述实例代码Put() and Get()描述实例代码CompiledScript描述实例代码Bindings描述实例代码大多的方法描述...
    99+
    2022-11-13
    Java ScriptEngine Java 动态执行JavaScript脚本
  • nGrinder中groovy的脚本结构是什么
    这篇文章跟大家分析一下“nGrinder中groovy的脚本结构是什么”。内容详细易懂,对“nGrinder中groovy的脚本结构是什么”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入...
    99+
    2023-06-05
  • Golang 动态脚本调研详解
    目录一、技术背景1.1 程序的动态链接技术1.1.1 动态链接库1.1.2 动态共享对象1.1.3 非编译语言的动态技术1.2 Golang 的动态技术二、Golang 的第三方解释...
    99+
    2024-04-02
  • Groovy的规则脚本引擎实例解读
    目录序言1.为什么用groovy作为规则引擎基于流程将Groovy与Java的集成1.GroovyClassLoader2.GroovyShell3.GroovyScriptEngi...
    99+
    2023-03-12
    Groovy规则脚本引擎 Groovy脚本 Groovy脚本引擎
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作