java 对象的脚本运行

<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]



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值