Skip to content

Commit 52b893a

Browse files
authored
Merge pull request qiujiayu#77 from realoldroot/master
update jdk11弃用Nashorn JavaScript引擎
2 parents e07f3b0 + 3f849b0 commit 52b893a

1 file changed

Lines changed: 78 additions & 94 deletions

File tree

Lines changed: 78 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,78 @@
1-
package com.jarvis.cache.script;
2-
3-
import com.jarvis.cache.CacheUtil;
4-
import lombok.extern.slf4j.Slf4j;
5-
6-
import javax.script.Bindings;
7-
import javax.script.Compilable;
8-
import javax.script.CompiledScript;
9-
import javax.script.ScriptEngine;
10-
import javax.script.ScriptEngineManager;
11-
import javax.script.SimpleBindings;
12-
import java.lang.reflect.Method;
13-
import java.util.concurrent.ConcurrentHashMap;
14-
15-
/**
16-
* 解析JavaScript表达式
17-
*
18-
* @author jiayu.qiu
19-
*/
20-
@Slf4j
21-
public class JavaScriptParser extends AbstractScriptParser {
22-
23-
private final ScriptEngineManager manager = new ScriptEngineManager();
24-
25-
private final ConcurrentHashMap<String, CompiledScript> expCache = new ConcurrentHashMap<String, CompiledScript>();
26-
27-
private final StringBuffer funcs = new StringBuffer();
28-
29-
private static int versionCode;
30-
31-
/**
32-
* 如果使用的是JDK大于1.8版本的,则用 nashorn,否则用javascript
33-
*/
34-
private final ScriptEngine engine;
35-
36-
static {
37-
String javaVersion = System.getProperty("java.version");
38-
int ind = 0;
39-
int cnt = 2;
40-
for (int i = 0; i < cnt; i++) {
41-
ind = javaVersion.indexOf(".", ind);
42-
ind++;
43-
}
44-
javaVersion = javaVersion.substring(0, ind);
45-
javaVersion = javaVersion.replaceAll("\\.", "");
46-
versionCode = Integer.parseInt(javaVersion);
47-
}
48-
49-
public JavaScriptParser() {
50-
engine = manager.getEngineByName(versionCode >= 18 ? "nashorn" : "javascript");
51-
try {
52-
addFunction(HASH, CacheUtil.class.getDeclaredMethod("getUniqueHashStr", new Class[]{Object.class}));
53-
addFunction(EMPTY, CacheUtil.class.getDeclaredMethod("isEmpty", new Class[]{Object.class}));
54-
} catch (Exception e) {
55-
log.error(e.getMessage(), e);
56-
}
57-
}
58-
59-
@Override
60-
public void addFunction(String name, Method method) {
61-
try {
62-
String clsName = method.getDeclaringClass().getName();
63-
String methodName = method.getName();
64-
funcs.append("function " + name + "(obj){return " + clsName + "." + methodName + "(obj);}");
65-
} catch (Exception e) {
66-
log.error(e.getMessage(), e);
67-
}
68-
}
69-
70-
@SuppressWarnings("unchecked")
71-
@Override
72-
public <T> T getElValue(String exp, Object target, Object[] arguments, Object retVal, boolean hasRetVal,
73-
Class<T> valueType) throws Exception {
74-
Bindings bindings = new SimpleBindings();
75-
bindings.put(TARGET, target);
76-
bindings.put(ARGS, arguments);
77-
if (hasRetVal) {
78-
bindings.put(RET_VAL, retVal);
79-
}
80-
CompiledScript script = expCache.get(exp);
81-
if (null != script) {
82-
return (T) script.eval(bindings);
83-
}
84-
if (engine instanceof Compilable) {
85-
Compilable compEngine = (Compilable) engine;
86-
script = compEngine.compile(funcs + exp);
87-
expCache.put(exp, script);
88-
return (T) script.eval(bindings);
89-
} else {
90-
return (T) engine.eval(funcs + exp, bindings);
91-
}
92-
}
93-
94-
}
1+
package com.jarvis.cache.script;
2+
3+
import com.jarvis.cache.CacheUtil;
4+
import lombok.extern.slf4j.Slf4j;
5+
6+
import javax.script.Bindings;
7+
import javax.script.Compilable;
8+
import javax.script.CompiledScript;
9+
import javax.script.ScriptEngine;
10+
import javax.script.ScriptEngineManager;
11+
import javax.script.SimpleBindings;
12+
import java.lang.reflect.Method;
13+
import java.util.concurrent.ConcurrentHashMap;
14+
15+
/**
16+
* 解析JavaScript表达式
17+
*
18+
* @author jiayu.qiu
19+
*/
20+
@Slf4j
21+
public class JavaScriptParser extends AbstractScriptParser {
22+
23+
private final ScriptEngineManager manager = new ScriptEngineManager();
24+
25+
private final ConcurrentHashMap<String, CompiledScript> expCache = new ConcurrentHashMap<String, CompiledScript>();
26+
27+
private final StringBuffer funcs = new StringBuffer();
28+
29+
private static int versionCode;
30+
31+
private final ScriptEngine engine;
32+
33+
public JavaScriptParser() {
34+
engine = manager.getEngineByName("javascript");
35+
try {
36+
addFunction(HASH, CacheUtil.class.getDeclaredMethod("getUniqueHashStr", new Class[]{Object.class}));
37+
addFunction(EMPTY, CacheUtil.class.getDeclaredMethod("isEmpty", new Class[]{Object.class}));
38+
} catch (Exception e) {
39+
log.error(e.getMessage(), e);
40+
}
41+
}
42+
43+
@Override
44+
public void addFunction(String name, Method method) {
45+
try {
46+
String clsName = method.getDeclaringClass().getName();
47+
String methodName = method.getName();
48+
funcs.append("function " + name + "(obj){return " + clsName + "." + methodName + "(obj);}");
49+
} catch (Exception e) {
50+
log.error(e.getMessage(), e);
51+
}
52+
}
53+
54+
@SuppressWarnings("unchecked")
55+
@Override
56+
public <T> T getElValue(String exp, Object target, Object[] arguments, Object retVal, boolean hasRetVal,
57+
Class<T> valueType) throws Exception {
58+
Bindings bindings = new SimpleBindings();
59+
bindings.put(TARGET, target);
60+
bindings.put(ARGS, arguments);
61+
if (hasRetVal) {
62+
bindings.put(RET_VAL, retVal);
63+
}
64+
CompiledScript script = expCache.get(exp);
65+
if (null != script) {
66+
return (T) script.eval(bindings);
67+
}
68+
if (engine instanceof Compilable) {
69+
Compilable compEngine = (Compilable) engine;
70+
script = compEngine.compile(funcs + exp);
71+
expCache.put(exp, script);
72+
return (T) script.eval(bindings);
73+
} else {
74+
return (T) engine.eval(funcs + exp, bindings);
75+
}
76+
}
77+
78+
}

0 commit comments

Comments
 (0)