动态Java代码注入

在本文中,我们将研究如何将Java代码动态加载到正在运行的jvm中。 该代码可能是全新的,或者我们可能想更改程序中某些现有代码的功能。

(在开始之前,您可能想知道为什么到底有人会这样做。显而易见的示例是规则引擎之类的东西。规则引擎希望为用户提供添加或更改规则的能力,而不必重新启动规则。您可以通过将DSL脚本作为规则注入,由规则引擎调用此方法,这种方法的真正问题是必须对DSL脚本进行解释,使其运行起来非常缓慢。然后可以像程序中的任何其他代码一样编译和运行该程序,效率将提高几个数量级。

在《纪事报》中,我们在新的微秒微服务/算法容器的核心中使用了这个想法。

我们将要使用的库是Chronicle开源库Java-Runtime-Compiler 。

从下面的代码中您将看到,该库的使用极其简单-实际上,它实际上只需要几行。 创建一个CachedCompiler,然后调用loadFromJava。 (有关实际最简单的用例,请参见此处的文档。)

下面列出的程序执行以下操作:

  1. 创建一个线程,该线程每秒调用一次Strategy。 该战略的投入为10和20。
  2. 加载将两个数字相加的策略
  3. 等待3秒
  4. 加载从另一个数中减去一个数的策略

这是完整的代码清单:

package test;import net.openhft.compiler.CachedCompiler;/*** Loads the addingStrategy and then after 3s replaces it with the * subtractingStrategy.*/
public class DynamicJavaClassLoading {private final static String className = "test.MyClass";private final static String addingStrategy = "package test;\n" +"import test.DynamicJavaClassLoading.Strategy;\n" +"public class MyClass implements Strategy {\n" +"    public int compute(int a, int b) {\n" +"        return a+b;\n" +"    }\n" +"}\n";private final static String subtractingStrategy = "package test;\n" +"import test.DynamicJavaClassLoading.Strategy;\n" +"public class MyClass implements Strategy {\n" +"    public int compute(int a, int b) {\n" +"        return a-b;\n" +"    }\n" +"}\n";public static void main(String[] args) throws Exception {StrategyProxy strategy = new StrategyProxy();//Thread calling the strategy once a secondThread t = new Thread(() -> {while (true) {System.out.println(strategy.compute(10,20));try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});t.start();{ClassLoader cl = new ClassLoader() {};CachedCompiler cc = new CachedCompiler(null, null);Class aClass = cc.loadFromJava(cl, className, addingStrategy);Strategy runner = (Strategy) aClass.newInstance();strategy.setStratgey(runner);}Thread.sleep(3000);{ClassLoader cl = new ClassLoader() {};CachedCompiler cc = new CachedCompiler(null, null);Class aClass = cc.loadFromJava(cl, className, subtractingStrategy);Strategy runner = (Strategy) aClass.newInstance();strategy.setStratgey(runner);}}public interface Strategy{int compute(int a, int b);}public static class StrategyProxy implements Strategy{private volatile Strategy underlying;public void setStratgey(Strategy underlying){this.underlying = underlying;}public int compute(int a, int b){Strategy underlying = this.underlying;return underlying == null ? Integer.MIN_VALUE : underlying.compute(a, b);}}
}

这是输出(蓝色注释):

The strategy has not been loaded yet. underlying in the StrategyProxy is null so Integer.MIN_VALUE is returned
-2 1 4 7 4 8 3 6 4 8
The adding strategy has been loaded 10+20=30
30
30
30
After 3s the subtracting strategy is loaded. It replaces the adding strategy. 10-20=-10
-10
-10
-10
-10-10

请注意,在每次加载策略时,在代码中我们都创建了一个新的ClassLoader和一个CachedCompiler。 这样做的原因是,ClassLoader一次只能加载一个特定类的一个实例。

如果仅使用该库来加载新代码,则可以这样做,而无需创建ClassLoader(即使用默认的ClassLoader)和CachedCompiler。

Class aClass = CompilerUtils.CACHED_COMPILER.loadFromJava(className, javaCode);

翻译自: https://www.javacodegeeks.com/2015/10/dynamic-java-code-injection.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TypeScript系列教程02】安装及使用

目录 TypeScript 安装 NPM 安装 TypeScript 测试安装结果 本教程使用VSCode TypeScript 安装 我们需要使用到 npm ,你需要安装Node.js; NPM 安装 TypeScript 如果你的本地环境已经安装了 npm 工具,可以使用以下命令来安装: npm install -g typescript

'scrapyd-deploy' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

在windows上使用scrapyd-client 安装后,并不能使用相应的命令scrapyd-deploy 需要在"C:\Python27\Scripts" 目录下 增加scrapyd-deploy.bat文件 内容填充为: echo off "C:\python27\python.exe" "C:\python27\Scripts\scrapyd…

【TypeScript系列教程03】基础语法

目录 TypeScript 基础语法 空白和换行 TypeScript 区分大小写 分号是可选的 TypeScript 注释 TypeScript 支持两种类型的注释

ccxt k线数据_寻找相似的历史k线

有网友提问应该用什么样的数据库/数据结构/算法来计算某支股票的相似K线? 具体的问题描述是,假设给出某股某段行情K线(单位/日),从任何其他股票历史中匹配出与之最为相似的某段历史K线,并给出相似度值(单位…

java引用 弱引用_了解Java弱引用

java引用 弱引用我最近没来得及关注这个博客,最重要的是,我没有为与技术界的所有人保持联系而致歉。 最近,我偶然发现了自Java 1.2起可用的java.lang.ref软件包,但具有讽刺意味的是,几天前我才知道它。 在浏览了几篇有…

【TypeScript系列教程04】编译参数

目录 编辑单个 .ts 文件 编辑多个 .ts 文件 tsc 常用编译参数 编辑单个 .ts 文件 通常我们使用 .ts 作为 TypeScript 代码文件的扩展名。 然后执行以下命令将 TypeScript 转换为 JavaScript 代码: tsc sunjiaoshou.js 编辑多个 .ts 文件 我们可以同时编译多个 ts 文件: …

传递数组到 Shader

https://chengkehan.github.io/UniformArray.html 转载于:https://www.cnblogs.com/jim-game-dev/p/5658023.html

k均值例子 数据挖掘_数据挖掘的技术有很多种,常用的数据挖掘技术就这13种...

数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的数据中,提取隐含在其中的、人们事先不知道的但又是潜在有用的信息和知识的过程。数据挖掘的任务是从数据集中发现模式,可以发现的模式有很多种,按功能可以分为两大类:预…

【TypeScript系列教程05】保留关键字

目录 TypeScript 保留关键字 TypeScript 保留关键字 TypeScript 保留关键字如下表所示:

Lucene组件概述

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中,以…

中国剩余定理 互质与非互质版本

中国剩余定理互质版 设m1,m2,m3,...,mk是两两互素的正整数,即gcd(mi,mj)1,i!j,i,j1,2,3,...,k. 则同余方程组: x a1 (mod n1) x a2 (mod n2) ... x ak (mod nk) 模[n1,n2,...nk]有…

aix 的c库为什么都是静态库_卢卡库:若梅罗、莱万都在努力突破极限,为什么我不能做到呢...

直播吧12月8日讯 北京时间周四凌晨的欧冠小组赛末轮比赛,国米将在主场迎战顿涅茨克矿工。目前,蓝黑军团依然保留着些许出线希望。在这场比赛之前,国米射手卢卡库接受了《法国足球》的采访,他谈论了和孔蒂的关系、和劳塔罗的搭档以…

【TypeScript系列教程06】基础类型

目录 TypeScript 基础类型 任意类型 (any) 变量的值会动态改变时 改写现有代码时 定义存储各种类型数据的数组时 数字类型 (number)

便携式不锈钢管道焊接机器人_304不锈钢管居然可以发黑?

大家好,我是圣联达不锈钢管材管件孙立成。今天有伙伴们问我,自己使用的304不锈钢管表面怎么发黑了。带着这个问题,今天我特意去梳理了有关304发黑的缘故及其解决方法。304不锈钢管实际上按照正常生产流程,好的304不锈钢管加工制做…

jrockit_Java堆空间– JRockit和IBM VM

jrockit本文将为您提供JRockit Java堆空间与HotSpot VM的概述。 它还将为您提供有关JRockit和HotSpot的Oracle未来计划的一些背景知识。 Oracle JRockit VM Java堆:2个不同的内存空间 -Java堆(YoungGen和OldGen) -本机内存空间(…

【TypeScript系列教程07】变量声明

目录 TypeScript 变量声明 实例 类型断言(Type Assertion) TypeScript 是怎么确定单个断言是否足够 类型推断 变量作用域 TypeScript 变量声明

【TypeScript系列教程08】运算符

目录 TypeScript 运算符 算术运算符 实例 关系运算符 逻辑运算符 短路运算符 (&& 与 ||) 位运算符

EAI的Spring集成教程

课程大纲 Spring Integration是用于企业应用程序集成的开源框架。 这是一个轻量级的框架,建立在核心Spring框架之上。 它旨在支持开发事件驱动的体系结构和以消息为中心的体系结构典型的集成解决方案。 Spring Integration扩展了Spring编程模型,以支持著…

检验例题_高考必考|化学工艺流程之物质的分离提纯及检验鉴别,轻松拿分

嗨,小器来喽!今天给大家带来的资料依旧是化学的工艺流程的相关知识,因为小器知道在这部分内容中大家是很容易丢分的,都是基础知识不扎实的原因,所以给大家的资料都是从易到难的安排还有专属高考相关例题,简…

tar命令核心应用案列及多重参数和find组合应用

tar zcvf 压缩包 文件 打包:尽量切换到打包目录的上级目录,然后用相对路径打包 tar zcvf [随意路径] /框 [相对路径] 一堆苹果 tar tf 查看内容 -z --gzip --ungzip filter the archive through gzip||调用gzip来压缩归档文件 -c --create create a ne…