Java封装动态编译
生活随笔
收集整理的這篇文章主要介紹了
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封装动态编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gdal影像镶嵌并裁剪
- 下一篇: java美元兑换,(Java实现) 美元