基于V8的JsonMapper
<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的更多相关文章
- 基于V8引擎的C++和JS的相互交互
基于什么原因略! 1. 脚本引擎的基本功能 V8只是一个JS引擎.去除它的特点功能出处,它必须要实现JS引擎的几个基础功能: 脚本执行:脚本可能是一个表达式:一段js代码:或者一个文件执行表达式返回j ...
- 初识NodeJS,一个基于GoogleV8引擎的Javascript运行环境
思考 首先我们来思考一个问题:我们都知道几乎所有现代主流浏览器都全面支持了ECMAScript 5.1版标准,而JavaScript的标准是ECMAScript.那么我们就容易认为JavaScript ...
- 深入出不来nodejs源码-V8引擎初探
原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲. 与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下 ...
- Google V8 引擎 原理详解
V8 引擎概览 V8 引擎简介 Google V8 引擎使用 C++ 代码编写,实现了 ECMAScript 规范的第五版,可以运行在所有的主流 操作系统中,甚至可以运行在移动终端 ( 基于 ARM ...
- JavaScript深入浅出第4课:V8引擎是如何工作的?
摘要: 性能彪悍的V8引擎. <JavaScript深入浅出>系列: JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼? JavaScript深入浅出第2课:函数是一等 ...
- V8的垃圾回收和内存限制
V8的垃圾回收和内存限制 前言 在第三次浏览器大战中,来自Google的Chrome浏览器凭借优异的性能成为聚光灯下的焦点.而Chrome的成功离不开站在其背后的JavaScript引擎V8. 随着V ...
- 基于node的前端项目编译时内存溢出问题
解决方法: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory JavaScript堆内存不足,这里说的 Jav ...
- Node.js 教程 05 - EventEmitter(事件监听/发射器 )
目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...
- 【历史】JavaScript和Java没啥关系!————JavaScript简史
文章的开始先上张图: 图片拍摄自北京图书大厦,代表着现在国内应该是绝大部分书店的现状--Javascript书籍放在Java类当中.甚至很多业内人也一直认为Javascript是Java语言在浏览器内 ...
随机推荐
- 微信公众号ios10.1 版本白屏问题
真机调试IOS 10.1.x的版本不支持fetch 所以一直loading显示白屏. 其他设备都没问题. 所以用主要属性window.fetch用来判断是否支持fetch 属性 import { ba ...
- share memory cache across multi web application
Single instance of a MemoryCache across multiple application pools on the same server [duplicate] Yo ...
- CenterOS 设置静态IP
本文主要介绍这样再CenterOS 中设定静态IP. 工具 centerOS 6.9 步骤 执行命令:vi /etc/sysconfig/network-scripts/ifcfg-eth0 编辑,填 ...
- Dubbo入门到精通学习笔记(十九):MySQL源码编译安装、MySQL主从复制的配置
文章目录 MySQL 源码编译安装(CentOS-6.6+MySQL-5.6) 一.服务器配置: 二.源码安装 MySQL5.6.26: MySQL主从复制的配置 环境 依赖课程 MySQL 主从复制 ...
- java遇到的问题
1.java 初始化泛型数组 public static <T> T[] toArray(java.util.List<T> src, Class<T> type) ...
- 洛谷 P2024 [NOI2001]食物链——带权值的并查集维护
先上一波题目 https://www.luogu.org/problem/P2024 通过这道题复习了一波并查集,学习了一波带权值操作 首先我们观察到 所有的环都是以A->B->C-> ...
- python之模块导入方法总结
模块在python编程中的地位举足轻重,熟练运用模块可以大大减少代码量,以最少的代码实现复杂的功能. 下面介绍一下在python编程中如何导入模块: (1)import 模块名:直接导入,这里导入模块 ...
- proc伪文件系统 - 加载一个进程
内核模块的编译方法及注意事项 Ubuntu内核(2.6.32) 2.6内核中,模块的编译需要配置过的内核源码:编译.链接后生成的内核模块后缀为.ko:编译过程首先会到内核源码目录下读取顶层的Makef ...
- idea部署tomcat项目时,在项目里打断点不能拦截
以下内容都是基于我自己的项目(如未解决道友们的问题,请别介意) idea部署tomcat项目时,在项目里打断点不能拦截,工作中遇到的问题,记录一下(tomcat6) 当项目的以下内容配置完毕后,启动项 ...
- HTMl中Meta标签和meta property=og标签含义
meta是head区的一个辅助性标签.其主要作用有:搜索引擎优化(SEO),定义页面使用语言,自动刷新并指向新的页面,实现网页转换时的动态效果,控制页面缓冲,网页定级评价,控制网页显示的窗口等! me ...