<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">这个Demo 不是 运行 engine.eval( val a = 5; val b = 6; val c = a+ b); 而是 调用 Java 的实例方法,实现脚本的OOP调用。</span>
public class User {
private int age;
private String name;
public User(String name,int age){
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User["+this.name +","+this.age+"]";
}
}
/**
* 目标调用方法,即脚本中调用这个类的方法
*
*/
public class UserManager {
private Map<String,User> userMap = new HashMap<String,User>();
public UserManager(){
System.out.println("--userManager init");
}
public void addUser(User user){
if(userMap.containsKey(user.getName()))return;
userMap.put(user.getName(), user);
System.out.print(Thread.currentThread().getStackTrace()[1].getMethodName()+"--");
System.out.println(user.toString());
}
public User getUser(String name){
User user = null;
for(String key:userMap.keySet()){
if(key.equals(name)){
user = userMap.get(key);
System.out.print(Thread.currentThread().getStackTrace()[1].getMethodName()+"--");
System.out.println(user.toString());
}
}
return user;
}
}
public interface LoadContext {
public void addUser(User user);
public User getUser(String name);
}
public class LoadContextImpl implements LoadContext {
public UserManager userManager;
public LoadContextImpl(UserManager userManager){
this.userManager = userManager;
}
@Override
public void addUser(User user){
userManager.addUser(user);
}
@Override
public User getUser(String name){
return userManager.getUser(name);
}
}
public class Resource {
private static final Resource resource = new Resource();
private static UserManager userManager = new UserManager();
private static final ScriptEngineManager engineManager = new ScriptEngineManager();
public static Resource getResource(){
return resource;
}
public static ScriptEngineManager getEngineManager(){
return engineManager;
}
public void startContainerAsStream(InputStream is){
LoadContext context = new LoadContextImpl(userManager);
if(is == null) return;
try {
BufferedReader in = new BufferedReader(new InputStreamReader(is));
execute(in, context); //in文件 里面的代码 调用 context 里的方法,执行器就是 scriptEngine
} catch (Exception e) {
e.printStackTrace();
}
}
private void execute(BufferedReader reader, LoadContext context){
SimpleScriptContext ssc=new SimpleScriptContext();
ssc.setAttribute("$", context, ScriptContext.ENGINE_SCOPE);
try {
getEngineManager().getEngineByExtension("js").eval(reader,ssc);
} catch (ScriptException e) {
e.printStackTrace();
}
}
}
test.js 文件
importPackage(com.test.script.bean);
user = new User("hello",3);
$.addUser(user);
测试类:
public class MainTest {
public static void main(String[] args){
//'/' 代表是在项目的根目录下,即 src 目录下, 而 没有 '/' 表明是在当前类的目录下 即 com/test/script/目录下
InputStream is = ClassLoader.class.getResourceAsStream("/test.js");
Resource.getResource().startContainerAsStream(is);
}
}
运行结果:
--userManager init
addUser--User[hello,3]