<dependency>
<groupId>com.eclipsesource.j2v8</groupId>
<artifactId>j2v8_win32_x86_64</artifactId>
<version>4.6.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.eclipsesource.j2v8</groupId>
<artifactId>j2v8_linux_x86_64</artifactId>
<version>4.6.0</version>
<scope>compile</scope>
</dependency>
package org.rx.util;

import com.alibaba.fastjson.JSONObject;
import com.eclipsesource.v8.V8;
import com.eclipsesource.v8.V8Object;
import com.google.common.annotations.Beta;
import com.google.common.base.Strings;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.rx.annotation.ErrorCode;
import org.rx.common.*; import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map; import static org.rx.common.Contract.*; @Beta
@Slf4j
public final class JsonMapper extends Disposable {
private static class V8Console {
public void log(String message) {
log.info("[V8] {}", message);
} public void error(String message) {
log.error("[V8] {}", message);
}
} public static final JsonMapper Default = new JsonMapper("jScript/");
private static final String scriptFunc = "(function(){var $={},$val=JSON.parse(_x); %s; return JSON.stringify($);})()"; private Map<String, Object> settings;
private Lazy<V8> runtime; public JsonMapper(String configPath) {
settings = refreshSettings(configPath);
runtime = new Lazy<>(() -> {
V8 v8 = V8.createV8Runtime();
V8Object v8Console = new V8Object(v8);
v8.add("console", v8Console);
V8Console console = new V8Console();
Class[] argTypes = new Class[]{String.class};
v8Console.registerJavaMethod(console, "log", "log", argTypes);
v8Console.registerJavaMethod(console, "error", "error", argTypes);
v8.executeScript("console.log('V8 start..');");
return v8;
});
} @Override
protected void freeObjects() {
if (runtime.isValueCreated()) {
runtime.getValue().release();
runtime = null;
}
} public <F, T> T convertTo(Class<T> toType, F from) {
require(toType, from); return convertTo(toType, from.getClass().getName(), from);
} public <T> T convertTo(Class<T> toType, String configKey, Object sourceValue) {
require(toType, configKey); String script = getScript(toType, configKey);
V8 v8 = runtime.getValue();
v8.add("_x", toJsonString(sourceValue));
String jResult = v8.executeStringScript(String.format(scriptFunc, script));
return JSONObject.parseObject(jResult, toType);
} @ErrorCode(value = "keyError", messageKeys = {"$key"})
private String getScript(Class tType, String key) {
String tKey = tType.getName();
Map<String, Object> v = as(settings.get(tKey), Map.class);
if (v == null) {
throw new SystemException(values(tKey), "keyError");
}
String script = (String) v.get(key);
if (Strings.isNullOrEmpty(script)) {
throw new SystemException(values(tKey + "." + key), "keyError");
}
return script;
} @SneakyThrows
private Map<String, Object> refreshSettings(String configPath) {
URL path = App.getClassLoader().getResource(configPath);
if (path == null) {
return Collections.emptyMap();
} Map<String, Object> map = new HashMap<>();
for (Path p : App.fileStream(Paths.get(path.toURI()))) {
try {
map.putAll(App.loadYaml(p.toString()));
} catch (Exception e) {
log.error("refreshSettings", e);
}
}
return map;
}
}
org.rx.util.DemoBean:
demoKey: >
$.id=$val.id;

基于V8的JsonMapper的更多相关文章

  1. 基于V8引擎的C++和JS的相互交互

    基于什么原因略! 1. 脚本引擎的基本功能 V8只是一个JS引擎.去除它的特点功能出处,它必须要实现JS引擎的几个基础功能: 脚本执行:脚本可能是一个表达式:一段js代码:或者一个文件执行表达式返回j ...

  2. 初识NodeJS,一个基于GoogleV8引擎的Javascript运行环境

    思考 首先我们来思考一个问题:我们都知道几乎所有现代主流浏览器都全面支持了ECMAScript 5.1版标准,而JavaScript的标准是ECMAScript.那么我们就容易认为JavaScript ...

  3. 深入出不来nodejs源码-V8引擎初探

    原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲. 与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下 ...

  4. Google V8 引擎 原理详解

    V8 引擎概览 V8 引擎简介 Google V8 引擎使用 C++ 代码编写,实现了 ECMAScript 规范的第五版,可以运行在所有的主流 操作系统中,甚至可以运行在移动终端 ( 基于 ARM ...

  5. JavaScript深入浅出第4课:V8引擎是如何工作的?

    摘要: 性能彪悍的V8引擎. <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一等 ...

  6. V8的垃圾回收和内存限制

    V8的垃圾回收和内存限制 前言 在第三次浏览器大战中,来自Google的Chrome浏览器凭借优异的性能成为聚光灯下的焦点.而Chrome的成功离不开站在其背后的JavaScript引擎V8. 随着V ...

  7. 基于node的前端项目编译时内存溢出问题

    解决方法: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory JavaScript堆内存不足,这里说的 Jav ...

  8. Node.js 教程 05 - EventEmitter(事件监听/发射器 )

    目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...

  9. 【历史】JavaScript和Java没啥关系!————JavaScript简史

    文章的开始先上张图: 图片拍摄自北京图书大厦,代表着现在国内应该是绝大部分书店的现状--Javascript书籍放在Java类当中.甚至很多业内人也一直认为Javascript是Java语言在浏览器内 ...

随机推荐

  1. HTML5+CSS3特效设计集锦

    20款CSS3鼠标经过文字背景动画特效 站长之家 -- HTML5特效索引 爱果果h5酷站欣赏  30个酷毙的交互式网站(HTML5+CSS3) 轻松搞定动画!17个有趣实用的CSS 3悬停效果教程 ...

  2. mysql5.6和5.7安装 centos

    mysql5.7安装 tar xf mysql--linux-glibc2.-x86_64.tar.gz mv mysql--linux-glibc2.-x86_64 /opt/mysql yum i ...

  3. CTF 密码学(一)

    0x00 前言 为了练习python,强迫自己能用Python的题都用python解题还有各种密码 0x01 奇怪的字符串 实验吧题目:信息保密的需求和实际操作自古有之,与之相应的信息加密与解密也是历 ...

  4. vue消息提示Message

    https://www.iviewui.com/components/message this.$Message.info(config) this.$Message.success(config) ...

  5. Area--->AreaRegister.RegisterAllArea()与Area区域的解析

    文章引导 MVC路由解析---IgnoreRoute MVC路由解析---MapRoute MVC路由解析---UrlRoutingModule Area的使用 Area--->AreaRegi ...

  6. Haproxy+ssl+nvm+forever

    1 nvm介绍 NVM(Node version manager)顾名思义,就是Node.js的版本管理软件,可以轻松的在Node.js各个版本间切换,项目源码在GitHub: #安装git客户端 [ ...

  7. 实用maven笔记四-打包&其他

    通过使用maven的生命周期和丰富多样的插件,可以方便的将项目代码编译打包为自己需要的构件. maven默认项目主代码位置src/main/java目录,测试代码位置src/test/java目录.主 ...

  8. zabbix--ODBC 监控mysql

    zabbix ODBC 数据库监控ODBC 是 C 语言开发的.用于访问数据库的中间件接口.zabbix 支持查询任何 ODBC 支持的数据库.zabbix 通过调用ODBC 来获取数据库的数据以及数 ...

  9. Vue之自建管理后台(一)准备工作

    完成最基础的Vue环境及新建一个vue项目. 一般来说,我们拿到一个项目需求或者得到一个需求的时候,第一件应该做的事情不是立马坐在电脑前面去写代码,如果你这么做的,好吧...我只能暂时认定你为一个刚上 ...

  10. 知识点整理01- 引用对象被子方法赋值后不改变;CheckBox 取消选择不可用问题

    1. Class 实体是引用类型,但传入方法时是null的情况在子方法中不论怎么赋值当 FirstService.SetPerson(person,ref tempMsg); 执行后Person都是n ...