Java封装动态编译
最近根据公司的业务需要通过前端页面传过来字符串的代码,并且通过动态编译然后执行,支持的类型为 JS、Java字符串、class文件 的方式,由于实现的方式都各不相同,所以进行统一封装一下
1. 代码结构
2. 实现结果测试
2.1 JS代码
@Testpublic void test_Js_compile() throws ScriptException, NoSuchMethodException, InterruptedException {CompletableFuture.runAsync(() -> {String str = "function bbb() { print(a); return a}; bbb()";Map<String, Object> map = new HashMap<>();map.put("a", "hello world");DynamicCompileWrapper<?> scriptEngine = DynamicCompileFactory.getScriptEngine(DynamicCompileType.JS);try {scriptEngine.execFunction(str, map);} catch (DynamicCompileException e) {e.printStackTrace();}});CompletableFuture.runAsync(() -> {String str = "function bbb() { print(a); return a}; ";Map<String, Object> map = new HashMap<>();map.put("a", "hello world2");DynamicCompileWrapper<?> scriptEngine = DynamicCompileFactory.getScriptEngine(DynamicCompileType.JS);try {scriptEngine.execFunctionForMethodName(str, "bbb", map);} catch (Exception e) {e.printStackTrace();}});Thread.currentThread().join();}
2.2 Java代码
@Testpublic void test_java_compile() throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, NoSuchMethodException {String code = "public class HelloWorld {\n" +" public void add(String a) {System.out.println(a);}\n" +" \n" +"}";DynamicCompileWrapper<JavaCompile> scriptEngine = (DynamicCompileWrapper<JavaCompile>) DynamicCompileFactory.getScriptEngine(DynamicCompileType.JAVA);JavaCompile engine = scriptEngine.getScriptEngine(code);engine.runMethod("add", "hello");}
2.3 Java文件
@Testpublic void test_java_file() {File file = new File("E:\\my-study-project\\practice\\src\\main\\java\\com\\zhj\\demo\\tls\\Tlsdemo.java");JavaCompile javaCompile = null;try {FileInputStream inputStream = new FileInputStream(file);ByteArrayOutputStream outputStream = new ByteArrayOutputStream();byte[] bytes = new byte[1024];int tempChar;while ((tempChar = inputStream.read(bytes)) != -1) {outputStream.write(bytes, 0, tempChar);}javaCompile = createInstance().getScriptEngine(new String(outputStream.toByteArray(), StandardCharsets.UTF_8));javaCompile.runMainMethod(new String[]{ });} catch (Exception e) {e.printStackTrace();}}
Java封装动态编译相关推荐
- 【java】深入理解Java的动态编译
文章目录 1.概述 2. 前提 3. 基本原理# 4. JDK动态编译 4.1 实现JavaFileObject 4.2 实现ClassLoader 4.3 实现JavaFileManager 4.4 ...
- java autoconf_PHP动态编译出现Cannot find autoconf
在安装完PHP后,想动态编译PHP的memcache扩展库cdmemcache-2.2.5//usPHP 在安装完PHP后,想动态编译PHP的memcache扩展库 cd memcache-2.2.5 ...
- java 反射 动态编译_动态编译java源代码和反射调用问题
我从教程中得到了以下代码: package com.tom.labs; import java.io.IOException; import java.lang.reflect.Method; imp ...
- JAVA中动态编译的简单使用
一.引用库 pom文件中申明如下: <dependencies><!-- https://mvnrepository.com/artifact/junit/junit -->& ...
- Java动态编译优化——URLClassLoader 内存泄漏问题解决
一.动态编译案例 要说动态编译内存泄漏,首先我们先看一个案例(网上搜动态编译的资料是千篇一律,只管实现功能,不管内存泄漏,并且都恬不知耻的标识为原创!!) Java URLClassLoader 动 ...
- java 动态字符串_Java动态编译执行一串字符串,类似于Javascript里的eval函数
Javascript里的eval函数能动态执行一串js脚本. 那Java里怎么做到呢. 有两种方法: 一种是使用可以执行js脚本的Java类 ScriptEngineManagerpublic sta ...
- Java动态编译执行
在某些情况下,我们需要动态生成java代码,通过动态编译,然后执行代码.JAVA API提供了相应的工具(JavaCompiler)来实现动态编译.下面我们通过一个简单的例子介绍,如何通过JavaCo ...
- 菜鸟学习笔记:Java提升篇12(Java动态性2——动态编译、javassist字节码操作)
菜鸟学习笔记:Java提升篇12(Java动态性2--动态编译.javassist字节码操作) Java的动态编译 通过脚本引擎执行代码 Java字节码操作 JAVAssist的简单使用 常用API ...
- 动态编译和静态编译及Java执行
静态编译就是在编译的时候把你所有的模块都编译进exe里去,当你启动这个exe的时候所有模块都加载进来了.你写小程序没问题,但程序一大,加载的过程(就是当你运行程序时初始化的过程)就比较费力了..大多数 ...
最新文章
- 2、安装ICS(Internet Component Suite)控件
- java关闭当前窗口打开另一窗口
- Console.WriteLine在以Windows Application方式下编译会产生性能问题
- 开始计算机USB存储功能,USB存储设备禁用怎么设置
- 部署项目到jetty
- java xy x y_为什么该语句在Java中不起作用x ^ = y ^ = x ^ = y;
- Java描述设计模式(06):建造者模式
- 使用跟踪和调试进行条件编译
- 红帽linux安装显卡驱动,RedHat Enterprise Linux 6 安装ATI显卡驱动
- Windows Server 2008 故障转移群集简介
- php存库,php – 使用Laravel实现存储库模式
- 基于Python实现的DHT嗅探器
- Java编程练习题3
- 单价数量和总价的公式_总价数量单价的数量关系式
- 麒麟V10系统安装教程
- Unity_回合制战斗系统_01
- 面试必备:《Java 最常见 200+ 面试题全面解析》
- 自然科学类计算机,自然科学基金委员会
- crm自动编号(第二天再次001从开始)
- 纷享销客CRM为虎邦辣酱的第二次增长插上数字化翅膀
热门文章
- 虹膜识别门禁,筑起智能安防首道屏障
- 【物联网学习笔记——人人学IoT系列】一、初识物联网
- 解决python3 UnicodeEncodeError: 'gbk' codec can't encode character '\U0001f608' in position。。。
- CMOS相机和CCD相机之间的像素合并(Binning)的区别
- android 动态改变进度条,Android条纹进度条的实现(调整view宽度仿进度条)
- 用python抓取小说,以龙王传说为例
- 阿里巴巴今晚发布财报 2019财年全年业绩也将一并公布
- 这两天不爽——公车上被误认为色狼、游泳撞破上嘴唇
- aardio 谷歌浏览器自动化 (三) 等待
- 高数叔数学建模学习笔记(1)