我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java动态脚本Groovy

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java动态脚本Groovy

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\\class="lazy" data-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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java动态脚本Groovy

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java动态脚本Groovy的特性是什么

这篇文章主要为大家展示了“Java动态脚本Groovy的特性是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java动态脚本Groovy的特性是什么”这篇文章吧。1.Groovy特性可将ja
2023-06-22

Java动态脚本Groovy获取Bean技巧是什么

本篇内容介绍了“Java动态脚本Groovy获取Bean技巧是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Groovy中不能使用@A
2023-06-22

如何在 Java 中调用 Groovy 脚本?(java怎么调用groovy脚本)

在Java开发中,有时候我们需要调用Groovy脚本以实现更灵活的业务逻辑。Groovy是一种基于Java的动态语言,它具有简洁的语法和丰富的库,能够提高开发效率。下面我们将详细介绍在Java中如何调用Groovy脚本。一、准备工作
如何在 Java 中调用 Groovy 脚本?(java怎么调用groovy脚本)
groovyJava2024-12-16

java中调用groovy脚本

java中调用groovy脚本
2023-06-03

Java怎么调用groovy脚本

这篇文章主要介绍“Java怎么调用groovy脚本”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java怎么调用groovy脚本”文章能帮助大家解决问题。使用方式GroovyShellGroovyS
2023-07-06

java如何调用Groovy脚本

这篇文章主要介绍了java如何调用Groovy脚本问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-14

Java调用groovy脚本的方式分享

Groovy 是一种基于 JVM 的动态语言,与 Java 语言紧密集成,可以很方便地在 Java 项目中使用。本文为大家整理了Java调用groovy脚本的几种方式,希望对大家有所帮助
2023-05-15

Java 如何实现动态脚本?

在平台级的 Java 系统中,动态脚本技术是不可或缺的一环。本文分享了一种 Java 动态脚本实现方案,给出了其中的关键技术点,并就类重名问题、生命周期、安全问题等做出进一步讨论,欢迎同学们共同交流。

如何将 Groovy 脚本直接编译成 Java 字节码?(Groovy脚本怎么直接编译成Java字节码)

在Java开发领域中,Groovy是一种非常强大的脚本语言,它可以与Java无缝集成,并且能够在Java虚拟机(JVM)上运行。Groovy脚本的开发效率非常高,同时又保留了Java的强大功能。然而,有时候我们需要将Groovy脚本直接编译成Java字节码,以便在一
如何将 Groovy 脚本直接编译成 Java 字节码?(Groovy脚本怎么直接编译成Java字节码)
groovyJava2024-12-13

为你的 awk 脚本注入 Groovy

awk 和 Groovy 相辅相成,可以创建强大、有用的脚本。
awk脚本Groovy2024-12-01

node.js 动态执行脚本

node.js最近新增了虚拟机模块,其实也不能说是新增的,只是把一些内部接口暴露出来罢了,从2.x就有了。我们可以从node / src / node.js看到这些代码:var Script = process.binding('evals
2022-06-04

Java详解ScriptEngine接口动态执行JS脚本

ScriptEngine是基本接口,其方法必须在本规范的每个实现中完全起作用。这些方法提供基本脚本功能。写入这个简单接口的应用程序可以在每个实现中进行最少的修改。它包括执行脚本的方法,以及设置和获取值的方法
2022-11-13

java脚本怎么设置多个动态变量

在Java脚本中,可以使用多个变量来存储和操作不同的值。下面是几种设置多个动态变量的方法:1. 使用单独的变量来存储每个值:```javaint variable1 = 10;String variable2 = "Hello";doubl
2023-09-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录